Ожидание базы в Docker
Ожидание базы пускает приложение
только после того,
как сервер ответил
на проверку.
Порядок старта
готовности не ждёт,
а условие здоровья ждёт.
Тогда Python поднимается,
когда pg_isready
уже проходит
внутри db.
Сервис db
на postgres:18
с базой db
и пользователем app
получает проверку
с паузой 5 секунд:
services:
db:
image: postgres:18
environment:
POSTGRES_PASSWORD: demo
POSTGRES_DB: db
POSTGRES_USER: app
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 5s
timeout: 5s
retries: 10
app:
build: .
ports:
- "8080:8000"
environment:
DB_HOST: db
DB_PORT: "5432"
DB_NAME: db
DB_USER: app
DB_PASSWORD: demo
depends_on:
db:
condition: service_healthy
Команда pg_isready
с флагом -U
и именем app
спрашивает, принимает ли
сервер соединения.
Сервис app
собирается из того же
скрипта с psycopg,
что и в уроке
про запрос:
база db,
таблица notes,
ответ hello
на порту 8080.
Пока статус db
не здоров,
app
не считается запущенным
по правилу зависимости.
Пересборка, подъём
и таблица notes:
docker compose up -d --build
docker compose exec db psql -U app -d db -c "CREATE TABLE IF NOT EXISTS notes (id SERIAL PRIMARY KEY, body TEXT); INSERT INTO notes (body) VALUES ('hello');"
В списке сервисов
app
появляется после
успешной проверки db.
Страница localhost:8080
отдаёт hello
без повторных обновлений
из-за неготовой базы.
Выполним просмотр
списка сервисов:
docker compose ps
Добавьте проверку готовности сервису store с паузой в 3 секунды и свяжите сервис note с условием здоровья store.
Поднимите проект в фоне и отметьте в списке сервисов, что note стартует после успешной проверки store.