Почему в docker падает приложение?
При выполнении команды docker compose up база данных разворачивается без проблем, но далее при разворачивании бекэнда выдает ошибку
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "0.0.0.0", port 5432 failed: Connection refused
menu_app | Is the server running on that host and accepting TCP/IP connections?
Я так понимаю, что бекэнд не может подключиться к БД через порт 5432. Как мне это исправить?
# docker-compose.yaml
version: "3.8"
services:
db:
container_name: db
image: postgres:15.1-alpine
environment:
POSTGRES_DB: "postgres"
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
networks:
- app_network
expose:
- "5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -d postgres -U postgres"]
interval: 10s
timeout: 3s
retries: 5
app:
container_name: menu_app
build:
context: .
dockerfile: Dockerfile
entrypoint: >
sh -c "
echo 'Making migrations...' &&
alembic upgrade head &&
echo 'Starting project...' &&
python app/main.py
"
networks:
- app_network
ports:
- 8000:8000
depends_on:
db:
condition: service_healthy
networks:
app_network:
name: app_network
# Dockerfile
FROM python:3.10-slim
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apt-get update -y
EXPOSE 8000
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt --no-cache-dir
CMD ["python", "app/main.py"]
# main.py
# some code
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1")
# session.py
# some code
SQLALCHEMY_DATABASE_URL = "postgresql+psycopg2://postgres:postgres@db:5432/postgres"
# some code
Ответы (2 шт):
Автор решения: Pak Uula
→ Ссылка
Это не ответ, а продолжение комментария.
Вообще говоря, имя хоста db в строке SQLALCHEMY_DATABASE_URL должно было автоматически распознаться DNS подсистемой докера, и адрес никак не мог быть 0.0.0.0
Предлагаю план Б. Вместо db подставить явный адрес узла:
# some code
addr = socket.gethostbyname('db')
print("DEBUG: db address: ", addr)
SQLALCHEMY_DATABASE_URL = f"postgresql+psycopg2://postgres:postgres@{addr}:5432/postgres"
Автор решения: Dmitriy Begishev
→ Ссылка
Ошибка заключалась в том, что у меня в alembic.ini был прописан хост 0.0.0.0, вместо db:
# alembic.ini
# some code
sqlalchemy.url = postgresql://postgres:postgres@db:5432/postgres
# some code