systemd сервис для запуска контейнера docker с dhcpd (РЕШЕНО)

vasek Если "на пальцах", то:
$ ps -ef | grep dhcpd
anton 357 341 1 12:19 tty1 00:00:00 grep dhcpd
$ docker ps
$ systemctl status docker_dhcpd
...
  Active: inactive (dead)
$ sudo systemctl start docker_dhcpd
$ systemctl status docker_dhcpd
...
  Active: active (exited)
$ docker ps
be1ab5c28f70 dhcpd:latest "/usr/sbin/dhcpd -f ..."  20 hours age  Up 44 seconds  0.0.0.0:67->67/tcp  dhcpd
$ ps -ef | grep dhcpd
root  600 583 1 12:20 ? 00:00:01 /usr/sbin/dhcpd -f -4
anton 651 341 0 12:22 tty1 00:00:00 grep dhcpd
$ sudo kill -9 600
$ ps -ef | grep dhcpd
anton 684 341 0 12:23 tty1 00:00:00 grep dhcpd
$ docker ps
$ systemctl status docker_dhcpd
...
  Active: active (exited)
$

Т. е. старт сервиса запускает контейнер, появляется процесс dhcpd - все хорошо.
Далее имитируем смерть процесса dhcpd
Процесс умирает, контейнер падает, а сервис - нет.

Тут суть в том, что сервис отслеживает процесс, описанный в ExecStart (docker start dhcpd). Он завершается с кодом 0 (контейнер запущен) и systemd считает сервис активным. Процесс dhpcd в данном случае не отслеживается и (как я понимаю) не является дочерним для ExecStart...
Anton8830
Процесс умирает, контейнер падает, а сервис - нет.
Имхо не нужен здесь сервис systemd, это лишнее имел ввиду другое - упал контейнер, перезапустили контейнер ... для перезапуска контейнера есть параметр --restart=always, что то типа - docker run --restart=always .....

PS - уточни, погугли по перезапуску контейнера ...
Ошибки не исчезают с опытом - они просто умнеют
vasek, спасибо.

Найдено 2 решения.

1. /etc/systemd/systm/docker_dhcpd.service
...
[Service]
Restart=on-failure
ExecStart=/usr/bin/docker run -p 67:67 --name dhcpd --rm dhcpd
ExecStop=/usr/bin/docker stop dhcpd
...
2. /etc/systemd/system/docker_dhcpd.service
...
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/docker run -p 67:67 -d --name dhcpd --restart on-failure dhcpd
ExecStop=/usr/bin/docker stop dhcpd
ExecStopPost=/usr/bin/docker rm dhcpd
...

В первом случае за перезапуск контейнера отвечает systemd, во втором - docker. И в том, и в другом случае контейнер после остановки сервиса удаляется.
Первый вариант, наверное, правильнее, с точки зрения организации контроля, хотя при остановке сервиса он становится Failure...
 
Зарегистрироваться или войдите чтобы оставить сообщение.