Текст и данные · Инструкция
Dockerfile HEALTHCHECK: без ложных unhealthy
Healthcheck отвечает на вопрос «жив ли сервис с точки зрения полезной функции», а не просто «запущен ли PID». Слишком тяжёлая проверка сама создаёт нагрузку, а слишком поверхностная не замечает поломку.
Короткий ответ
HEALTHCHECK должен быстро проверять критический признак готовности сервиса и возвращать 0 при успехе, 1 при проблеме. Настройте interval, timeout, retries и.
Что важно понять до начала
Dockerfile поддерживает `HEALTHCHECK` с командой и временными параметрами. Код выхода команды определяет успешность проверки. Start period позволяет сервису прогреться до применения обычной логики failures. Проверка должна зависеть от реально необходимого компонента, но не превращаться в полноценный end-to-end тест всей инфраструктуры.
Совет: Практический ориентир: HEALTHCHECK только сообщает состояние. Политика перезапуска реагирует прежде всего на завершение процесса; конкретная оркестрация может отдельно использовать health status.
Пошаговый порядок действий
- 1. Выберите один дешёвый сигнал здоровья: локальный HTTP endpoint, socket или короткую команду приложения.
- 2. Сделайте команду явно возвращающей ненулевой код при проблеме.
- 3. Задайте timeout короче interval, а retries — так, чтобы краткий всплеск не вызывал ложную тревогу.
- 4. Добавьте start-period для миграций, прогрева cache или долгого старта JVM.
- 5. Сломайте зависимость намеренно и проверьте переход healthy → unhealthy, затем восстановление.
Важно: Критично для этой задачи: Не используйте healthcheck, который всегда возвращает 0 после проверки «процесс существует».
Ошибки и пограничные случаи
Не используйте healthcheck, который всегда возвращает 0 после проверки «процесс существует». Это создаёт ложное чувство надёжности и не выявляет зависший сервис. Если endpoint здоровья обращается к внешним API, сбой чужого сервиса может пометить все ваши контейнеры unhealthy. Включайте во healthcheck только зависимости, без которых инстанс действительно не способен обслуживать запрос.
Предупреждение: Пограничный случай: Он даёт приложению время на штатный запуск до того, как ранние неуспешные проверки начнут считаться обычными failures.
Проверка перед завершением
- Выберите один дешёвый сигнал здоровья: локальный HTTP endpoint, socket или короткую команду приложения.
- Задайте timeout короче interval, а retries — так, чтобы краткий всплеск не вызывал ложную тревогу.
- Сломайте зависимость намеренно и проверьте переход healthy → unhealthy, затем восстановление.
- Проверено отдельно: HEALTHCHECK только сообщает состояние. Политика перезапуска реагирует прежде всего на завершение процесса; конкретная оркестрация может отдельно использовать health status.
Практический сценарий и контроль результата
Хороший healthcheck отвечает на один вопрос: способен ли этот экземпляр обслуживать свою основную функцию. Команда должна быть дешёвой и иметь понятный exit code; проверка внешней цепочки из нескольких сервисов создаёт ложные unhealthy при чужом сбое. Отдельно протестируйте негативный сценарий: временно сломайте локальный endpoint и убедитесь, что статус действительно меняется. Затем восстановите сервис и проверьте возврат в healthy. Тайминги start-period и retries должны отражать реальное время запуска, а не маскировать постоянную неисправность.
Дополнительные нюансы и проверка
Healthcheck должен завершаться быстрее, чем interval, иначе проверки могут наслаиваться и создавать лишнюю нагрузку. Команда также должна существовать в финальном образе: curl в build‑stage не поможет, если его нет в runtime. Если используете HTTP endpoint, проверяйте код ответа и таймаут, а не только факт открытия TCP‑порта. После изменения посмотрите health status через inspect и убедитесь, что history показывает ожидаемые успешные и неуспешные проверки, а не случайные timeouts.
Что учитывать
Dockerfile поддерживает `HEALTHCHECK` с командой и временными параметрами. Код выхода команды определяет успешность проверки. Start period позволяет сервису прогреться до применения обычной логики failures. Проверка должна зависеть от реально необходимого компонента, но не превращаться в полноценный end-to-end тест всей инфраструктуры.
Источники и проверка
Фактическая часть сверена по первичным источникам (в т.ч. Dockerfile HEALTHCHECK). Пример и формулировки — редакция N1RO на 2026-09-22.