#Что означает ошибка и при каких условиях возникает
Если контейнер Docker показывает unhealthy и одновременно перезапускается, выясните, из-за чего завершается основной процесс и что управляет перезапуском. Проверка HEALTHCHECK сама по себе не перезапускает контейнер в обычном Docker Engine. Статус unhealthy и цикл Restarting могут иметь разные причины; внешняя система наблюдения может связывать их.
#Как различить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверная проверочная командаПроверка обращается к неправильному порту или использует утилиту, которой нет в образе. | Контейнер продолжает работать, но в State.Health.Log записаны коды выхода 1 либо 127. | Сначала исправить команду healthcheck без изменения основного приложения. |
| Приложение завершается самоОсновной процесс прекращает работу из-за ошибки конфигурации, подключения или нехватки ресурсов; restart policy запускает его вновь. | docker inspect показывает RestartCount больше нуля, ExitCode не ноль, в docker logs есть ошибка. | Исследовать журнал и причину завершения приложения, а не только проверку здоровья. |
| Контейнер перезапускает внешний управляющий механизмМонитор, скрипт, Swarm/Kubernetes либо инструмент наблюдения реагирует на unhealthy. | Приложение не падает самостоятельно, но есть события stop/kill или сообщения соответствующего управляющего средства. | Проверить его правила и устранить ложный критерий нездоровья. |
| Слишком короткий период запускаСервис долго инициализируется, а проверка начинает считаться неудачной раньше готовности. | В логах приложения есть этап прогрева; позднее оно начинает отвечать. | Уточнить start_period, retries, timeout после измерения реального запуска. |
#Пошаговая диагностика и исправление
- Выберите способ в командной строке или терминалеЕсли предыдущие действия не помогли, прочитайте назначение каждого варианта ниже. Не выполняйте их все подряд: выбирайте только соответствующий вашей ситуации.
- Не путайте перезапуск с unhealthyВыполните
docker compose ps -aи найдите имя сервиса, например web. Если в STATUS написано Up (unhealthy), контейнер продолжает работать — Docker Engine только зафиксировал неудачную проверку. Если видно Restarting или повторные короткие периоды Up, изучайте завершение основного процесса. Запомните точное имя сервиса и не применяйте перезапуск как способ диагностики. - Установите, завершается ли основной процессПолучите идентификатор через
docker compose ps -q web(замените web названием своего сервиса). Подставьте полученный идентификатор вdocker inspect --format ..., приведённую ниже. В результате ищите State.ExitCode, RestartCount и RestartPolicy. Если RestartCount увеличивается, проверяйте логи приложения; если он равен нулю, ошибка может быть исключительно в healthcheck. Не публикуйте полный вывод inspect: там могут быть переменные окружения с секретами. - Посмотрите подробность неудачной проверкиПо идентификатору контейнера выполните
docker inspect --format "{{json .State.Health}}" ИДЕНТИФИКАТОР. В ответе ищите Status и Log/Output: например,wget: not foundпоказывает отсутствующую утилиту, connection refused — неправильный порт или ещё не готовый сервис. Если поле Health отсутствует, проверка в контейнере не задана: переходите к диагностике лога основного процесса, а не придумывайте healthcheck. - Сравните проверку с фактическим сервисомОткройте compose.yaml в редакторе (например, VS Code: «Файл» → «Открыть папку»). Найдите
services→ нужную службу →healthcheck.test. Сравните адрес:127.0.0.1внутри контейнера — это сам контейнер, не ваш компьютер; порт должен совпадать с тем, на котором слушает программа внутри. Убедитесь, что названная в test программа установлена в образе. Для образа Python можно использовать встроенныйurllib.request, а не требовать curl. - Настройте период проверки для медленного запускаЕсли сервис исправно начинает отвечать лишь после инициализации, сначала по журналу определите примерное время прогрева. В compose.yaml для этой службы задайте разумные
start_period,interval,timeout,retries; проверьте YAML командойdocker compose config -q. Если проверка синтаксиса ошибочна, верните копию compose.yaml и исправьте отступы. Изменение healthcheck требует пересоздания затронутой службы, поэтому на рабочей системе согласуйте остановку и сохраните состояние. - Пересоздайте только тестовый сервис и перепроверьтеДля локального тестового проекта выполните
docker compose up -d --no-deps --force-recreate web, заменив имя сервиса своим. Команда пересоздаёт контейнер (возможна краткая недоступность), поэтому её нельзя без согласования применять к базе данных либо приложению с данными исключительно в слое контейнера. Затемdocker compose psиdocker compose logs --tail=60 web: ожидайте Up (healthy) после старта; если появляется Restarting, проверяйте фактическую ошибку процесса. - Если процесс стабильный, ищите внешний перезапускНа обычном Docker Engine значение unhealthy не является условием restart policy. Проверьте, нет ли у проекта стороннего монитора, скриптов проверки, заданий cron или оркестратора; при их наличии изучайте события и правила только с администратором. Не отключайте наблюдение на рабочем сервере. Если причина не найдена, зафиксируйте время, RestartCount, отредактированные сообщения Health.Log и docker compose logs без секретов.
#Минимальный пример для отдельного тестового проекта
services:
web:
image: python:3.12-alpine
command: ["python", "-m", "http.server", "8000", "--bind", "0.0.0.0"]
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/', timeout=3)"]
interval: 10s
timeout: 5s
retries: 3
start_period: 15s#Как проверить результат и что делать, если проблема осталась
После исправления дождитесь нескольких интервалов проверки, выполните docker compose ps и убедитесь в стабильном Up (healthy) и неизменном RestartCount. Если статус unhealthy при отсутствии Restarting, проблема именно в проверке; если Restarting продолжается — передайте администратору безопасные выдержки из журналов и сведений о завершении основного процесса.