Короткий ответ
HEALTHCHECK периодически выполняет заданную команду внутри контейнера и на основе её кода выхода определяет статус healthy/unhealthy/starting, который виден в docker ps и может использоваться для оркестрации (условия depends_on в compose, политика restart, внешние балансировщики).
Как это работает подробнее
Docker запускает указанную команду с заданным интервалом (--interval), таймаутом (--timeout) и числом допустимых неудачных попыток (--retries) перед сменой статуса на unhealthy. В отличие от обычного статуса "процесс запущен/остановлен", healthcheck проверяет, что приложение внутри контейнера реально отвечает на уровне своей бизнес-логики (например, HTTP-эндпоинт /health возвращает 200), а не просто что процесс PID 1 существует.
Пример кода
Dockerfile
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1Что использовать на практике
- Практика. healthcheck особенно важен для сервисов, у которых процесс может "висеть" живым, но фактически не обрабатывать запросы (deadlock, потеря соединения с зависимостью); в docker-compose условие
depends_on: condition: service_healthyпозволяет не запускать зависимый сервис, пока его зависимость не стала healthy, что снижает число ошибок на старте из-за гонки условий.
Подводные камни
- Риск. делают healthcheck слишком "тяжёлым" (например, полный прогон интеграционных проверок), создавая дополнительную нагрузку при частом интервале; не разделяют readiness (готовность принимать трафик) и liveness (процесс жив) смысл внутри одной команды healthcheck, что в сложных случаях приводит к неверной интерпретации статуса.