2017-01-05 7 views
0

Я пытаюсь запустить контейнер 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?

+0

Вам действительно нужна система? Демон Docker будет продолжать работать. Команда «run» имеет параметр политики перезапуска: https://docs.docker.com/engine/reference/run/#/restart-policies---restart –

+0

Мне нужно для запуска нескольких взаимозависимых сервисов в производстве, поэтому я хочу использовать чистый (иш) способ управления ими. Я не уверен, как я буду использовать 'docker run' напрямую. rc.local? руководство? – aayore

+0

Демон Docker сам по себе является менеджером процессов. Когда вы запускаете контейнер с параметрами «-d» и «--restart = always», он запускается в фоновом режиме и автоматически перезапускается после сбоя. –

ответ

0

Я выяснил, как заставить это работать, а решение - это нечто вроде facepalm. То, что я пытался сделать, было прекрасно, мне просто нужен полный путь к grep и спать.

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 | /bin/grep -m 1 \"String that indicates my service is up successfully\" ]; do /bin/sleep 1; done 

Я проверил его немного, и, похоже, он работает очень хорошо.

 Смежные вопросы

  • Нет связанных вопросов^_^