Docker Compose wait: дождаться готовности и завершения

Категория: docker · Язык: YAML · Обновлено:

docker compose up --wait блокируется, пока сервисы не перейдут в состояние running или healthy. docker compose wait ждёт остановки контейнеров и возвращает код завершения последнего из них. Первая команда подходит для запуска API и базы, вторая — для миграций и других one-shot задач в CI.

Описать healthcheck и зависимость

YAML
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_healthy

condition: service_healthy заставляет Compose ждать успешного healthcheck, а не просто запуска процесса. Без healthcheck --wait считает сервис готовым, как только контейнер перешёл в running, даже если приложение ещё не слушает порт. Для базы задайте pg_isready, для API — HTTP-проверку /health.

Дождаться запуска и завершения

Bash
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.