Docker Compose wait: дождаться готовности и завершения
docker compose up --wait блокируется, пока сервисы не перейдут в состояние running или healthy. docker compose wait ждёт остановки контейнеров и возвращает код завершения последнего из них. Первая команда подходит для запуска API и базы, вторая — для миграций и других one-shot задач в CI.
Описать healthcheck и зависимость
services:
db:
image: postgres:17-alpine
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 2s
timeout: 3s
retries: 10
api:
build: .
depends_on:
db:
condition: service_healthy
migrate:
build: .
command: ["python", "-m", "app.migrate"]
depends_on:
db:
condition: service_healthycondition: service_healthy заставляет Compose ждать успешного healthcheck, а не просто запуска процесса. Без healthcheck --wait считает сервис готовым, как только контейнер перешёл в running, даже если приложение ещё не слушает порт. Для базы задайте pg_isready, для API — HTTP-проверку /health.
Дождаться запуска и завершения
docker compose up -d --wait --wait-timeout 60
docker compose up -d migrate
docker compose wait migrate--wait подразумевает detached-режим и завершается с ошибкой, если сервис не стал healthy за --wait-timeout секунд. docker compose wait migrate блокируется до выхода контейнера и возвращает его код: 0 при успехе, ненулевой при падении миграции. Это позволяет CI остановиться до запуска приложения, если схема не обновилась.
Не запускайте wait для долгоживущего API: команда будет висеть до остановки контейнера. Для проверки готовности используйте up --wait или docker compose ps --status running. Если контейнер уже завершился до вызова wait, Compose вернёт сохранённый код завершения.
В docker compose wait можно передать несколько сервисов; код последнего завершившегося определит результат. Для параллельных задач это неудобно — запускайте их отдельно или анализируйте docker compose ps -a. Флаг --down-project удаляет проект после остановки первого контейнера, но для отладки лучше явный docker compose down.
Документация: docker compose wait, docker compose up.