Я пытаюсь запустить контейнер Docker в качестве сервиса. Это кластерная служба на нескольких разных серверах, и для соединения может потребоваться несколько секунд. Контейнер иногда застревает в цикле отказов, фактически не выходя из контейнера. Поэтому systemd ошибочно сообщает об успешном запуске. Я стараюсь следить за процессом с этими вещами в моем единичном файле:Мониторинг файла журнала для запуска службы systemd
TimeoutStartSec=60
Restart=always
RestartSec=10
ExecStartPre=-/usr/bin/docker stop %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull my_container
ExecStart=/usr/bin/docker run --name %n my_container
ExecStartPost=until [ /usr/bin/docker logs %n 2>&1 | grep -m 1 \"All services up and running.\" ]; do sleep 1; done
Когда я бегу systemctl start myservice
, это занимает несколько секунд, чтобы начать (по-видимому, из-за docker pull
), но возвращает успех относительно быстро.
Однако, если я вручную запускаю docker logs -f myservice.service
, я вижу, что служба не регистрирует «Все службы запущены и работают» еще на несколько секунд.
Я смотрел https://github.com/ibuildthecloud/systemd-docker, но я опасаюсь репо, которое не обновлялось более года (кажется, Даррен занят Ранчем).
Итак, мой вопрос: Почему мой ExecStartPost не работает? Есть ли лучший способ запуска контейнеров в качестве службы непосредственно с systemd?
Вам действительно нужна система? Демон Docker будет продолжать работать. Команда «run» имеет параметр политики перезапуска: https://docs.docker.com/engine/reference/run/#/restart-policies---restart –
Мне нужно для запуска нескольких взаимозависимых сервисов в производстве, поэтому я хочу использовать чистый (иш) способ управления ими. Я не уверен, как я буду использовать 'docker run' напрямую. rc.local? руководство? – aayore
Демон Docker сам по себе является менеджером процессов. Когда вы запускаете контейнер с параметрами «-d» и «--restart = always», он запускается в фоновом режиме и автоматически перезапускается после сбоя. –