Почему в docker падает приложение?

Рейтинг: 1Ответов: 2Опубликовано: 17.04.2023

При выполнении команды 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

Ответы

▲ 1Принят

Ошибка заключалась в том, что у меня в alembic.ini был прописан хост 0.0.0.0, вместо db:

# alembic.ini

# some code 

sqlalchemy.url = postgresql://postgres:postgres@db:5432/postgres

# some code
▲ 1

Это не ответ, а продолжение комментария.

Вообще говоря, имя хоста 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"