Надёжный старт стека 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 не защищает от гонки старта, потому что зависимый сервис его фактически не использует.
Комплексная проверка цепочки целиком перед продакшн-деплоем даёт более честную картину готовности, чем изолированная проверка отдельных звеньев.