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 изображении.

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