Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

DOCKER_HEALTHCHECK_FAILED Linux / DevOps

Настройка проверок Healthcheck в Dockerfile для автоматического перезапуска

Обновлено: 21.08.2026
  • Контейнер зависает (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
💡 Практика специалистов: Не используйте ресурсоемкие команды в healthcheck (например, тяжелые SQL-запросы или запуск тяжелых интерпретаторов). Проверка должна быть легковесной и опрашивать выделенный /health эндпоинт приложения.

Частые вопросы (FAQ)

Что означает параметр --start-period в HEALTHCHECK?

Это время начальной инициализации приложения (прогрев кэша, запуск JVM, миграции БД), в течение которого неудачные проверки не увеличивают счетчик сбоев retries.

Что должно возвращать выражение CMD в HEALTHCHECK?

Команда должна завершиться с кодом 0 (healthy) или 1 (unhealthy). Код 2 зарезервирован Docker.

Полезные материалы
Рекомендуем