Контейнеры с включенной проверкой работоспособности Docker останавливаются через некоторое время
Недавно я наблюдаю проблему с контейнерами Docker, в которых HEALTHCHECK
настроен. Не только собственные контейнеры, но и сторонние контейнеры.
Одни и те же контейнеры без настроенной проверки работоспособности работают нормально любое время.
См. Конфигурацию проверки работоспособности внизу сообщения.
Я также использую rediscommander/redis-commander
образ для графического интерфейса Redis, который, по-видимому, имеет HEALTHCHECK
внутри это Dockerfile
. Большую часть времени я используюdocker-compose
для запуска моих проектов стал. инфраструктуры.
Все контейнеры с настроенной проверкой работоспособности (обаDockerfile
или docker-compose
способами) через некоторое время останавливаются, даже если к ним не обращались / не использовались.
Под заглохшим я подразумеваю несколько вещей:
docker ps
контейнер отчетовup
а такжеunhealthy
. Однако скрипт проверки работоспособности все еще работает.- Контейнер недоступен.
- Любая попытка обратиться к нему заканчивается отказом в соединении, поэтому кажется, что внутри ничего не работает.
- Оболочка не может быть прикреплена
- Контейнер никак нельзя остановить / перезапустить / удалить.
docker stop 123456abcd
завершается с переданным идентификатором контейнера без ошибок, но безрезультатно. - Остановка службы докеров также не позволяет легко удалить контейнер. его каталог все еще смонтирован. Перезапуск служб докеров не решает проблему.
- Служба контейнера не отвечает (например, на странице веб-сервера отображается
ERR_SOCKET_NOT_CONNECTED
)
Когда это происходит, я вижу постоянно увеличивающееся использование ЦП в процессеcontainerd-shim -namespace moby -workdir /var/lib/containerd/...
которого тоже нельзя убить.
Я попытался найти возможное решение в сети, но не нашел ничего подходящего, кроме containerd/issue#3572
и не уверен, что это вообще актуально.
Единственное решение, которое помогает мне, - это перезапуск хост-компьютера с отключенной службой докеров, удаление каталога контейнера вручную и повторный запуск.
Любая помощь в решении этой проблемы приветствуется!
Моя конфигурация проверки работоспособности
Мои контейнеры настраиваются двумя способами:
-
HEALTHCHECK
сDockerfile
-
heathcheck
сdocker-compose.yml
(Compose файл v3.4 используется)
Dockerfile HEALTHCHECK
пример
HEALTHCHECK --interval=60s --timeout=1s --start-period=5s \
CMD node /some/service1/healthcheck.js
докер-сочинять healthcheck
пример
healthcheck:
test: ["CMD", "/in/container/healthcheck.sh"]
interval: 10s
timeout: 2s
Информация о докере
# docker-compose --version
docker-compose version 1.26.2
# docker info
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
Kernel Version: 5.7.17-2-MANJARO
Operating System: Manjaro Linux
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 15.54GiB