Инструкция HEALTHCHECK
Тема дорожной карты · Docker & Containers
HEALTHCHECK — это важный инструмент для Docker, который позволяет определить текущее состояние контейнера. Команда, заданная через HEALTHCHECK, запускается Docker периодически для проверки, находится ли контейнер в состоянии healthy, unhealthy или starting. Определение состояния контейнера помогает Docker и оркестраторам, таким как Kubernetes, автоматически перезапускать или переконфигурировать контейнеры в случае проблем.
Синтаксис инструкции HEALTHCHECK выглядит следующим образом: HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 CMD curl -f http://localhost/ || exit 1. В этом примере HEALTHCHECK запускается каждые 30 секунд, ожидает завершения команды в течение 5 секунд, начинает проверку через 10 секунд после запуска контейнера и повторяет проверку три раза, если первая проверка не удалась. Если команда завершается успешно, контейнер считается здоровым; если команда завершается ошибкой, контейнер считается нездоровым.
Эта инструкция интегрируется с командами docker ps, где состояние контейнера отображается в столбце Health, а также с depends_on: condition: service_healthy в файле docker-compose.yml. Кроме того, HEALTHCHECK используется для автоматического перезапуска контейнеров в режиме Swarm.
Как это работает
Инструкция HEALTHCHECK работает в тесной интеграции с другими компонентами Docker, такими как BuildKit (современный builder, который стал дефолтным с версии 22.0), multi-stage сборки, build-secrets, cache mounts, build args против runtime env, мульти-платформенные сборки через buildx.
Примеры использования HEALTHCHECK включают команды для кэширования npm/pnpm между сборками: RUN --mount=type=cache,target=/root/.npm, и для инжектирования секретов, которые не попадают в слой: RUN --mount=type=secret,id=mytoken. Важно понимать, что ARG используется на этапе сборки (build-time), в то время как ENV используется на этапе выполнения (runtime).
Когда применять
Инструкция HEALTHCHECK особенно полезна в контексте BuildKit и --mount=type=cache, что позволяет значительно уменьшить время сборки CI для проектов, которые скачивают пакеты. Это особенно актуально для многоплатформенных сборок, где таргет может быть как x86_64, так и arm64 (например, Raspberry Pi, M-series Mac, Graviton).
HEALTHCHECK следует использовать для всех долгоживущих сервисов, чтобы убедиться, что ожидания docker-compose up и проверки оркестратора были корректными. Это особенно важно для сервисов, которые могут быть недоступны в течение нескольких секунд после запуска.
Типичные ошибки
При использовании HEALTHCHECK могут возникнуть различные проблемы. Например, секреты, которые передаются через ARG, могут утечь в историю и быть видимыми в docker inspect. Также важно избегать случайного сбоя кэша после каждого apt update, поскольку это может привести к изменению следующей инструкции. Группировка apt-команд в один RUN помогает избежать этого.
Еще одна распространенная ошибка — забыть установить переменную DOCKER_BUILDKIT=1 на старом Docker, что может привести к ошибке "unknown flag" при использовании --mount. Также важно правильно настроить интервалы проверки, чтобы избежать ситуации, когда контейнер помечается как unhealthy еще до того, как он полностью запущен.