Psql не найден в сценарии для попытки управления порядком запуска и выключения в Docker Compose
Я пытаюсь убедиться, что мое приложение Django ожидает запуска моей базы данных Postgres, чтобы не получить эту ошибку django.db.utils.OperationalError: FATAL: the database system is starting up
, я прочитал это https://docs.docker.com/compose/startup-order/, и вот что у меня есть на данный момент
docker-compose.yml
version: "3.9"
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
environment:
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
backend:
build: ./backend
command: python3 manage.py runserver
volumes:
- ./backend:/code
ports:
- "8000:8000"
command: ["./wait-for-it.sh", "db", "bash", "entrypoint.sh"]
depends_on:
- db
wait-for-it.sh
#!/bin/sh
# wait-for-it.sh
set -e
host="$1"
shift
cmd="$@"
# postgres
until PGPASSWORD=$DB_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done
>&2 echo "Postgres is up - executing command"
exec $cmd
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.9.6-alpine3.14
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN \
apk add --no-cache postgresql-libs && \
apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev && \
python3 -m pip install -r requirements.txt --no-cache-dir && \
apk --purge del .build-deps
COPY . /code/
RUN chmod u+x ./wait-for-it.sh
Вы пытаетесь объединить несколько различных решений.
Прежде всего, если вы используете pg_isready
, вам не нужны никакие пользовательские скрипты wait-for-it.sh
, потому что pg_isready
работает отлично. Поэтому просто удалите ваш файл wait-for-it.sh
.
Кроме того, если вы используете healthcheck
в docker-compose.yml
, вам не нужно вручную запускать скрипты проверки перед запуском вашего entrypoint.sh
. Но вам нужно добавить условие в раздел depends_on
. Поэтому измените ваш docker-compose.yml
на следующий:
version: "3.9"
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"]
interval: 5s
timeout: 5s
retries: 5
environment:
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
backend:
build: ./backend
volumes:
- ./backend:/code
ports:
- "8000:8000"
command: entrypoint.sh
depends_on:
db:
condition: service_healthy
Обратите внимание, я также изменил команду test
в разделе healthcheck
и удалил первую команду command
в backend
изображении.