@AllocBoe

Какую ошибку я допустил в Dockerfile во время накатывания миграций?

Имею такой Dockerfile:
# Используем базовый образ с Python 3.11-slim-bookworm
FROM python:3.11-slim-bookworm

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=on \
    PIP_DEFAULT_TIMEOUT=100 \
    POETRY_NO_INTERACTION=1 \
    POETRY_VIRTUALENVS_CREATE=false

ENV PATH="${PATH}:/root/.local/bin"

EXPOSE 8000
EXPOSE 5433


RUN apt-get -y update && \
    apt-get install -y --no-install-recommends \
    build-essential \
    libpq-dev \
    postgresql-client \
    libssl-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && pip install --no-cache-dir poetry

WORKDIR /app

COPY pyproject.toml poetry.lock ./
COPY . .

RUN poetry update  # Обновление зависимостей
RUN poetry install --no-root  # Установка зависимостей

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]


и такой Docker-compose:
version: "3.0"
services:
  db:
    container_name: "db"
    image: postgres:14.1-alpine
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
    ports:
      - "5433:5432"
    networks:
      - custom
  db_test:
    container_name: "db_test"
    image: postgres:14.1-alpine
    restart: always
    environment:
      - POSTGRES_USER=postgres_test
      - POSTGRES_PASSWORD=postgres_test
      - POSTGRES_DB=postgres_test
    ports:
      - "5434:5432"
    networks:
      - custom
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    networks:
      - custom
    depends_on:
      - db
      - db_test
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -h db -p 5432 -U postgres" ]
      interval: 5s
      timeout: 10s
      retries: 5
    command: alembic -c alembic.ini upgrade heads
networks:
  custom:
    driver: bridge


приложение на FastAPI(ORM SQLAchemy), хочу накатить миграции, они не накатываются, т.к. возникает ошибка портов, почему для меня не понятно т.к. объединил сервисы в одну сеть и распараллелил порты для бд

вот урл в sqlalchemy
sqlalchemy.url = postgresql://postgres:postgres@db:5433/postgres

вот микро-лог ошибки:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "db" (172.24.0.3), port 5433 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?

где я допустил ошибку? возможно есть более удобное решение для накатки миграций чем у меня?
  • Вопрос задан
  • 528 просмотров
Решения вопроса 1
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
ports делает соответствие между портами на хосте и в контейнере соответственно, внутри докерной сети ничего не меняется. Потому в sqlalchemy.url оставляйте 5432
З.Ы. посмотрите на хелсчек (:
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@calculator212
connection to server at "db" (172.24.0.3), port 5433 failed: Connection refused
Тут напрямую говорит вам, что проблема в подключении к БД, т.е. идёт попытка коннекта к 5433, но на нём либо ничего нет, либо соединение блокируется( в большинстве случаев там ничего нет)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы