Ошибка «Container "..." is unhealthy»
Вопрос:
При запуске скрипта bs.sh возникает ошибка:
«ERROR: for <имя_контейнера> Container «<id_контейнера>» is unhealthy.
ERROR: Encountered errors while bringing up the project.»
В чем может быть причина данной ошибки и как ее устранить?
Ответ:
Данная ошибка означает, что контейнер <имя_контейнера> не прошел проверку состояния (healtchcheck) и сейчас находится в состоянии «unhealthy», см. Таблицу 1.
Сервис запущен, но не прошел проверку состояния. Из-за этого Docker останавливает поднятие всей системы.
| Состояние | Описание |
|---|---|
| healthy | Сервис работает корректно |
| unhealthy | Сервис не отвечает на healthcheck-запросы |
| starting | Контейнер еще не успел пройти проверку (идет запуск) |
Внимание! Важно отличать результаты проверки состояния контейнера (healtchcheck) от результатов проверки статуса. Контейнер может быть в статусе UP (запущен), но при этом не готов к работе (unhealthy). Необходимо добиться состояния healthy для всех контейнеров.
Чтобы понять, какой именно сервис не прошел проверку, нужно проверить статусы всех контейнеров командой:
sudo docker ps -a
Пример вывода команды:
CONTAINER ID NAME STATUS f700e37a2feb bs-backend Up 2 minutes (unhealthy) a12b34c56d78 postgres Up 10 minutes (healthy)
После обнаружения контейнера в состоянии unhealthy нужно посмотреть его логи:
sudo docker logs <имя_контейнера или id_контейнера>
Открыть логи контейнера, например postgresql, можно следующей командой: (ключ --tail N используется для ограничения вывода логов последними N строками):
sudo docker logs postgresql --tail 10
Пример вывода логов контейнера postgresql:
UTC [27] LOG: checkpoint starting: time UTC [27] LOG: checkpoint complete: wrote 36 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=3.527 s, sync=0.059 s, total=3.681 s; sync files=11, longest=0.020 s, average=0.006 s; distance=262 kB, estimate=1975 kB; lsn=3/13AAC520, redo lsn=3/13AAC4E8
Наиболее вероятная причина почему healtcheck может не пройти - это нехватка ресурсов сервера (CPU/RAM).
Это может быть вызвано:
- Несоответствием системным требованиям, см. Системные требования.
- Запуском дополнительного ресурсоёмкого ПО.
Способы решения проблемы:
- Увеличить время проверки healthcheck. Для этого нужно увеличить значение параметра
start_periodв файлеdocker-compose.yml(в блоке проблемного сервиса, в разделеhealthcheck), как минимум, вдвое. - Отключить время проверки healthcheck. Для этого нужно закомментировать (символом
#в начале строки) параметрstart_periodв файлеdocker-compose.yml(в блоке проблемного сервиса, в разделеhealthcheck). - Увеличить ресурсы сервера.
- Не запускать на сервере стороннее ресурсоёмкое ПО.