Docker и systemd — служба останавливается через 10 секунд

У меня возникли проблемы с тем, чтобы контейнер Docker оставался в рабочем состоянии, когда он запускается systemd. Когда я запускаю его вручную с помощью sudo docker start containername, он работает без проблем, но когда он запускается через systemd с помощью sudo systemctl start containername, он остается в течение 10 секунд, а затем таинственным образом умирает, оставляя сообщения в системном журнале примерно следующего содержания:

Mar 13 14:01:09 hostname docker[329]: time="2015-03-13T14:01:09Z" level="info" msg="POST /v1.17/containers/containername/stop?t=10"
Mar 13 14:01:09 hostname docker[329]: time="2015-03-13T14:01:09Z" level="info" msg="+job stop(containername)"

Я предполагаю, что systemd убивает процесс, но я не могу понять, почему это может происходить. Файл модуля systemd (/etc/systemd/system/имя_контейнера.service) довольно прост:

[Unit]
Description=MyContainer
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker start containername
ExecStop=/usr/bin/docker stop containername

[Install]
WantedBy=multi-user.target

Docker запускается нормально при загрузке, и похоже, что он даже запускает контейнер Docker, но независимо от того, загружается он или вручную, он завершает работу ровно через 10 секунд. Помощь принята с благодарностью!


person n00b    schedule 13.03.2015    source источник
comment
Проверь это. Я отошел от докера, прежде чем слишком углубиться в эту проблему. github.com/ibuildthecloud/systemd-docker   -  person user2105103    schedule 13.03.2015
comment
Спасибо, я проверю! Я исправил проблему, но это может легко остановить меня в будущем.   -  person n00b    schedule 14.03.2015


Ответы (1)


Решение. Похоже, что команде start требуется параметр -a (присоединить), как описано в документации. при использовании в сценарии systemd. Я предполагаю, что это связано с тем, что по умолчанию он переходит в фоновый режим, хотя системная expect daemon функция не отображается исправить проблему.

со страницы руководства docker-start:

-a, --attach=true|false
   Attach container's STDOUT and STDERR and forward all signals to the process. The default is false.

Весь системный скрипт становится таким:

[Unit]
Description=MyContainer
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker start -a containername
ExecStop=/usr/bin/docker stop containername

[Install]
WantedBy=multi-user.target
person n00b    schedule 14.03.2015
comment
Клиент Docker не переходит в фоновый режим с помощью -d, он просто завершает работу и завершает работу. Контейнер остается запущенным на хосте докера, но systemd ничего об этом не знает. - person Adrian Mouat; 08.04.2015