Образ докера backend не ждет, пока db станет доступным

Я пытаюсь docker-compose up свои контейнеры, один для бэкенда, а другой для базы данных (postgis). Если я docker-compose up db, я вижу db_1 | 2021-11-23 10:36:02.123 UTC [1] LOG: database system is ready to accept connections, так что это работает.

Но если я docker-compose up весь проект, я получаю

django.db.utils.OperationalError: could not connect to server: Connection refused
web_1  |        Is the server running on host "db" (172.23.0.2) and accepting
web_1  |        TCP/IP connections on port 5432?

Насколько я знаю, это означает, что мой backend image не ждет, пока db станет доступным, и выдает ошибку. Если эта идея верна (так ли это?), то одним из решений может быть:

  • добавить некоторый код, чтобы заставить изображение бэкенда ждать db, как описано здесь: 1Docker-compose up do not start backend after database . Я пытался реализовать решения с помощью цикла while (см. закомментированные строки в docker-compose.yaml), но в моем случае это не работает, и, честно говоря, я не совсем понимаю "анатомию" этих команд.

Теперь у меня два подвопроса:

  1. Do I understand my problem correctly?
  2. How to solve it?

Заранее большое спасибо всем, кто попытается мне помочь!

Мои файлы находятся ниже:

docker-compose.yaml

version: "3.9"

services:
  db:
    image: postgis/postgis
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgis
      - POSTGRES_USER=postgis
      - POSTGRES_PASSWORD=postgis
    ports:
      - 5432:5432
      #postgres: 5432

  web:
    build: .

    #command: /wait-for-it.sh db:5432
    #command: ["./wait-for-it.sh", "db:5432", "--", "./start.sh"]
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./:/usr/src/[projectname-backend]/
    ports:
      - "8000:8000"
    env_file:
      - ./.env.dev
    depends_on:
      - db

volumes:
  db:

Dockerfile

FROM python:3.8.3-alpine

WORKDIR /usr/src/LISTA_backend

RUN apk update && apk upgrade \
  && apk add postgresql-dev \
    gcc \
    python3-dev \
    musl-dev \
    libffi-dev \
  && apk add --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \
    gdal-dev \
    geos-dev \
    proj-dev \
  && pip install pipenv

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY . .

Большое спасибо тем, кто мне помогает. На самом деле, моя проблема заключалась в следующем: если я healthcheck мой db контейнер и попрошу мой web контейнер ждать db с:

- ./scripts/wait-for-it:/root/scripts/wait-for-it

или что-то вроде этого, я также не должен забыть добавить условие к моему depends_on вроде этого:

depends_on:
      db:
        condition: service_healthy

, как упоминалось в обсуждении здесь.

Теперь это работает. Счастливого Дня благодарения!

Вернуться на верх