Задание CRON для проверки запущенного порта контейнера и перезапуска сервера в случае ошибки

#docker #cron

Вопрос:

У меня есть скрипт на python, работающий внутри контейнера docker, с API REST внутри контейнера (локальный доступ к порту с 8085)

Все работает отлично (http://{host_ip_address:8085}), но время от времени контейнер перестает отвечать на http-запросы, перезапуск контейнера решает проблему.

Я хотел бы настроить задание CRON на хосте, на котором запущен контейнер, чтобы проверить, что http://localhost:8085 отвечает, и если нет, перезапустите контейнер.

для меня нормально перезапустить все запущенные контейнеры на машине, поэтому команда сбоя может быть:

 docker restart $(docker ps -a -q)
 

Как я могу этого достичь ?

Комментарии:

1. Типичная практика контейнеров заключается в том, что должно быть безопасно останавливать, удалять и воссоздавать контейнеры; хотя это зависит от приложения и означает знание соответствующих docker run команд. docker restart может быть небезопасно, так как это не приводит к сбросу файловой системы контейнера в известное состояние, поэтому, например, существуют распространенные проблемы, связанные с оставлением файлов pid.

Ответ №1:

Отвечая на мой собственный вопрос:

у докера есть HEALTHCHECK инструкция опросить контейнер с помощью любой команды, которую мы хотим. к сожалению, на момент написания статьи контейнер не перезапустится автоматически, если он не работает.

Вот моя инструкция по проверке работоспособности в файле Dockerfile (приложение предоставляет порт 8085):

 HEALTHCHECK --interval=1m --timeout=30s --start-period=45s 
    CMD curl -f --retry 6 --max-time 5 --retry-delay 10 --retry-max-time 60 "http://localhost:8085" || bash -c 'kill -s 15 -1 amp;amp; (sleep 10; kill -s 9 -1)'