Целесообразно ли запускать процессы докера под наблюдением runit/daemontools

Я запускаю процессы докера (приложения) через

docker run …

Но под runit supervision (runit похож на daemontools) - таким образом, runit гарантирует, что процесс будет работать, передает сигналы и т. д.

Это разумно? Docker, похоже, хочет запустить свою собственную демонизацию - но он не такой тщательный, как runit. Более того, когда runit перезапускает приложение - каждый раз создается новый контейнер (хорошо), но он оставляет след старого, - кажется, это означает, что я делаю это неправильно.

Разве докер не должен работать таким образом?

Должен ли я вместо этого установить контейнер из образа, только один раз, и затем выполнить runit, чтобы запустить / контролировать этот контейнер за все время?

2 ответа

Docker действительно управляет демонизированными контейнерами: если система выключается, то, когда запускается демон Docker, он также перезапускает все контейнеры, которые работали в момент выключения системы. Но если контейнер выходит сам или ядро ​​(или пользователь) убивает контейнер во время его работы, демон Docker не перезапустит его. В тех случаях, когда вы хотите перезапустить, диспетчер процессов имеет смысл.

Я не знаю runit поэтому я не могу дать конкретные указания по настройке. Но вы, вероятно, должны сделать так, чтобы менеджер процессов связывался с демоном docker и проверял, запущен ли данный идентификатор контейнера (docker ps | grep container_id или эквивалентный, или используйте Docker Remote API напрямую). Если контейнер остановился, используйте Docker для его перезапуска (docker run container_id) вместо запуска нового контейнера. Или, если вы хотите каждый раз новый контейнер, то начните с docker run -rm для автоматической очистки, когда он выходит или останавливается.

Если вы не хотите, чтобы ваш менеджер процессов опрашивал Docker, вместо этого вы можете запустить что-то, что смотрит docker events,

Вы можете получить container_id при запуске контейнера как возвращаемое значение запуска демона, или вы можете попросить Docker записать это в файл (docker run -cidfile myfilenameкак файл PID)

Я надеюсь, что это помогает или помогает другому runit Гуру предложит более подробный совет.

Да, я думаю, что запуск докера под runit имеет смысл. Как правило, когда вы запускаете процесс, есть способ сказать ему не демонизировать, если он делает по умолчанию, так как обычный способ передачи из runit run сценарий к процессу через exec на последней строчке вашего run скрипт. Для докера это означает, что нужно не устанавливать -d флаг.

Например, с помощью docker вы, вероятно, хотите, чтобы ваш скрипт запуска выглядел примерно так:

#!/bin/bash -e
exec 2>&1
exec chpst -u dockeruser docker run -a stdin -a stdout -i ...

С помощью exec а также chpst должен решить большинство проблем с процессами, которые не завершаются корректно, когда вы отключаете сервис runit

Другие вопросы по тегам