Настройка проверок Healthcheck в Dockerfile для автоматического перезапуска
- Контейнер зависает (Deadlock / 100% CPU), но процесс PID 1 жив, поэтому Docker считает его рабочим.
- Балансировщики нагрузки направляют трафик на «зависшие» контейнеры.
- Статус контейнера переходит в
(unhealthy)в выводеdocker ps.
1. Настройка HEALTHCHECK в Dockerfile для веб-приложений
FROM node:20-alpine
WORKDIR /app
COPY . .
# Настройка проверки через curl / wget
HEALTHCHECK --interval=10s --timeout=3s --start-period=30s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:8080/health || exit 1
EXPOSE 8080
CMD ["node", "server.js"]2. Проверка истории и логов healthcheck
docker inspect <container_id> --format='{{json .State.Health}}' | jq .3. Автоматический перезапуск Unhealthy контейнеров через autoheal
Docker Daemon самостоятельно не перезапускает нездоровые контейнеры. Для этого разверните контроллер willfarrell/autoheal:
docker run -d \
--name autoheal \
--restart=always \
-e AUTOHEAL_CONTAINER_LABEL=autoheal \
-v /var/run/docker.sock:/var/run/docker.sock \
willfarrell/autohealДобавьте лейбл целевому контейнеру:
docker run -d --label autoheal=true my_app:latest Частые вопросы (FAQ)
Что означает параметр --start-period в HEALTHCHECK?
Это время начальной инициализации приложения (прогрев кэша, запуск JVM, миграции БД), в течение которого неудачные проверки не увеличивают счетчик сбоев retries.
Что должно возвращать выражение CMD в HEALTHCHECK?
Команда должна завершиться с кодом 0 (healthy) или 1 (unhealthy). Код 2 зарезервирован Docker.