~/guides/compose-readiness-chain-pre-start-healthcheck

Docker Compose

pre_start + healthcheck + depends_on: как выстроить полную цепочку готовности без гонки

Три связанных звена надёжного старта Docker Compose стека и почему слабое звено в любом из них ломает всю цепочку.

Надёжный старт стека Docker Compose — это не одна проверка, а цепочка из трёх связанных звеньев. Слабое звено в любом из трёх ломает всю цепочку готовности, даже если остальные два звена в порядке.

Три звена цепочки

services:
  app:
    depends_on:
      db:
        condition: service_healthy
    pre_start:
      - command: ["./manage.py", "migrate"]
  db:
    image: postgres:18
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]

Первое звено — идемпотентность шага pre_start (миграция должна безопасно переживать повторный запуск). Второе — наличие и корректность healthcheck у зависимости db. Третье — правильное условие в depends_on, ссылающееся именно на service_healthy, а не на более слабое service_started.

Как ломается цепочка при выпадении одного звена

Слабое звено Что происходит
pre_start неидемпотентен Повторный запуск после частичного сбоя создаёт дубли или ошибку
Нет healthcheck у зависимости depends_on не может гарантировать реальную готовность, а не просто запуск процесса
Неверное условие в depends_on Даже при наличии healthcheck зависимый сервис не дожидается готовности

Почему проверять звенья по отдельности недостаточно

Проверка только healthcheck без учёта depends_on не покажет, что зависимый сервис на самом деле указывает service_started вместо service_healthy — формально healthcheck есть, а реальной защиты от гонки старта нет, потому что условие ожидания не использует этот healthcheck.

Практика комплексного review перед первым продакшн-деплоем

Перед тем как полагаться на новый стек в проде, разумно проверить всю цепочку целиком для каждого сервиса, а не отдельные звенья изолированно — целостная картина показывает реальную надёжность старта, а не отдельные, формально пройденные проверки.

Как проверить всю цепочку сразу

Compose Readiness Chain Batch Validator проверяет все три звена одновременно по нескольким сервисам и файлам.

Итоговый чеклист

Надёжный старт стека зависит от трёх связанных звеньев — идемпотентности pre_start, наличия healthcheck, и правильного условия в depends_on — а не от любого одного из них.

Формально настроенный healthcheck без правильного condition в depends_on не защищает от гонки старта, потому что зависимый сервис его фактически не использует.

Комплексная проверка цепочки целиком перед продакшн-деплоем даёт более честную картину готовности, чем изолированная проверка отдельных звеньев.