Я пишу свой API бронирования с помощью FastAPI (все конечные точки работают без докера). У меня есть файл докера:
FROM python:3.11
RUN mkdir /booking
WORKDIR /booking
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD [ "gunicorn", "app.main:app", "--workers", "4", "--worker-class", "uvicorn.workers.UvicornWorker", "--bind=0.0.0.0:8000" ]
И docker-compose.yml:
services:
db:
image: postgres:16
container_name: booking_db
env_file:
- .env-non-dev
ports:
- 5432:5432
redis:
image: redis:7
container_name: redis
booking:
image: booking_image
build:
context: .
container_name: booking_app
env_file:
- .env-non-dev
depends_on:
- db
- redis
command: sh -c "alembic upgrade head && gunicorn app.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind=0.0.0.0:8000"
ports:
- 8000:8000
celery:
build:
context: .
container_name: booking_celery
command: sh -c "celery --app=app.tasks.celery_app:celery worker -l INFO"
env_file:
- .env-non-dev
depends_on:
- redis
flower:
build:
context: .
container_name: booking_flower
command: sh -c "celery --app=app.tasks.celery_app:celery flower"
env_file:
- .env-non-dev
depends_on:
- redis
Когда я делаю Docker Compose, моя база данных подключается: booking_db | 2024-10-10 21:30:22.665 UTC [1] ЖУРНАЛ: система базы данных готова принимать соединения
но когда мое приложение пытается выполнить обновление перегонного куба
но когда мое приложение пытается выполнить обновление перегонного куба
code> возникает исключение:
2024-10-12 19:03:22 Traceback (most recent call last):
2024-10-12 19:03:22 File "/usr/local/bin/alembic", line 8, in
2024-10-12 19:03:22 sys.exit(main())
2024-10-12 19:03:22 ^^^^^^
2024-10-12 19:03:22 File "/usr/local/lib/python3.11/site-packages/alembic/config.py", line 636, in main
2024-10-12 19:03:22 CommandLine(prog=prog).main(argv=argv)
2024-10-12 19:03:22 File "/usr/local/lib/python3.11/site-packages/alembic/config.py", line 626, in main
2024-10-12 19:03:22 self.run_cmd(cfg, options)
2024-10-12 19:03:22 File "/usr/local/lib/python3.11/site-packages/alembic/config.py", line 603, in run_cmd
2024-10-12 19:03:22 fn(
2024-10-12 19:03:22 File "/usr/local/lib/python3.11/site-packages/alembic/command.py", line 406, in upgrade
2024-10-12 19:03:22 script.run_env()
2024-10-12 19:03:22 File "/usr/local/lib/python3.11/site-packages/alembic/script/base.py", line 582, in run_env
2024-10-12 19:03:22 util.load_python_file(self.dir, "env.py")
2024-10-12 19:03:22 File "/usr/local/lib/python3.11/site-packages/alembic/util/pyfiles.py", line 95, in load_python_file
2024-10-12 19:03:22 module = load_module_py(module_id, path)
2024-10-12 19:03:22 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.................
booking_app | File "/usr/local/lib/python3.11/site-packages/asyncpg/connection.py", line 2329, in connect
booking_app | return await connect_utils._connect(
booking_app | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
booking_app | File "/usr/local/lib/python3.11/site-packages/asyncpg/connect_utils.py", line 1017, in _connect
booking_app | raise last_error or exceptions.TargetServerAttributeNotMatched(
booking_app | File "/usr/local/lib/python3.11/site-packages/asyncpg/connect_utils.py", line 991, in _connect
booking_app | conn = await _connect_addr(
booking_app | ^^^^^^^^^^^^^^^^^^^^
booking_app | File "/usr/local/lib/python3.11/site-packages/asyncpg/connect_utils.py", line 828, in _connect_addr
booking_app | return await __connect_addr(params, True, *args)
booking_app | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
booking_app | File "/usr/local/lib/python3.11/site-packages/asyncpg/connect_utils.py", line 873, in __connect_addr
booking_app | tr, pr = await connector
booking_app | ^^^^^^^^^^^^^^^
booking_app | File "/usr/local/lib/python3.11/site-packages/asyncpg/connect_utils.py", line 744, in _create_ssl_connection
booking_app | tr, pr = await loop.create_connection(
booking_app | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
booking_app | File "/usr/local/lib/python3.11/asyncio/base_events.py", line 1094, in create_connection
booking_app | raise OSError('Multiple exceptions: {}'.format(
booking_app | OSError: Multiple exceptions: [Errno 111] Connect call failed ('::1', 5432, 0, 0), [Errno 111] Connect call failed ('127.0.0.1', 5432)
Я думаю, что мое приложение не может запуститься из-за головки обновления перегонного куба, потому что оно начинается с
command: sh -c "gunicorn app.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind=0.0.0.0:8000"
но когда я пытаюсь работать с какой-то конечной точкой, возникает исключение
P.S. я добавил POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD в файл .env-non-dev
Моя информация о базе данных .env-non-dev:
DB_HOST=db
DB_PORT=5432
DB_USER=postgres
DB_PASS=postgres
DB_NAME=booking_app
DB_DRIVER="postgresql+asyncpg"
DATABASE_URL=${DB_DRIVER}://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}
POSTGRES_DB=booking_app
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
Я попытался запустить приложение без головки обновления перегонного куба, и это сработало. Пытался сделать это с помощью bash-скриптов, но мое приложение их тоже не увидело.
Файл env.py:
from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context
from app.config import settings
from app.database import Base
from app.hotels.models import Hotels
from app.hotels.rooms.models import Rooms
from app.users.models import Users
from app.bookings.models import Bookings
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
config.set_main_option("sqlalchemy.url", f"{settings.DATABASE_URL}?async_fallback=True")
# Interpret the config file for Python logging.
# This line sets up loggers basically.
if config.config_file_name is not None:
fileConfig(config.config_file_name)
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
target_metadata = Base.metadata
# other values from the config, defined by the needs of env.py,
# can be acquired:
# my_important_option = config.get_main_option("my_important_option")
# ... etc.
def run_migrations_offline() -> None:
"""Run migrations in 'offline' mode.
This configures the context with just a URL
and not an Engine, though an Engine is acceptable
here as well. By skipping the Engine creation
we don't even need a DBAPI to be available.
Calls to context.execute() here emit the given string to the
script output.
"""
url = config.get_main_option("sqlalchemy.url")
context.configure(
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
)
with context.begin_transaction():
context.run_migrations()
def run_migrations_online() -> None:
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
connectable = engine_from_config(
config.get_section(config.config_ini_section, {}),
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)
with connectable.connect() as connection:
context.configure(
connection=connection, target_metadata=target_metadata
)
with context.begin_transaction():
context.run_migrations()
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
Подробнее здесь: https://stackoverflow.com/questions/790 ... er-compose
OSError: несколько исключений при подключении к базе данных с помощью docker-compose ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
OSError: несколько исключений при подключении к базе данных с помощью docker-compose
Anonymous » » в форуме Python - 0 Ответы
- 210 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Ошибка сегментации PHP при подключении к базе данных доступа к базе данных
Anonymous » » в форуме Php - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-