Образ докера 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), но в моем случае это не работает, и, честно говоря, я не совсем понимаю "анатомию" этих команд.
Теперь у меня два подвопроса:
- Do I understand my problem correctly?
- 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
, как упоминалось в обсуждении здесь.
Теперь это работает. Счастливого Дня благодарения!