Почему процесс systemd, запущенный в контейнере докера с PID 1, не пересылает SIGTERM дочерним процессам при остановке докера

У нас есть контейнер Docker, в котором запущен systemd в качестве основного процесса (PID 1). Мы также запустили наши рабочие процессы в контейнере Docker через модуль systemd. Наши контейнеры Docker используют CentOS 7.2. Мы настроили тайм-аут остановки Docker, чтобы можно было корректно завершить работу рабочих процессов, запущенных внутри контейнера Docker. Когда мы останавливаем контейнер Docker, мы видим, что SIGTERM получен в процесс systemd, который работает с PID 1 внутри контейнера. Также контейнер ожидает тайм-аута остановки, который мы настроили. Но процесс systemd не пересылает этот SIGTERM нашим рабочим процессам, которые мы начали использовать с помощью модуля systemd. Из журналов похоже, что когда systemd получает SIGTERM, он пытается повторно выполнить себя. Мы пробовали добавить KillMode = mixed в наш файл модуля systemd, но у нас это не сработало.

Есть ли способ перенаправить SIGTERM из процесса systemd в дочерние процессы?


person Sachin    schedule 19.04.2017    source источник
comment
может быть полезным прочитать: engineeringblog.yelp. ru / 2016/01 /   -  person Anthony Sottile    schedule 19.04.2017
comment
Из общей статьи похоже, что обычный системный init (в нашем случае systemd) должен иметь возможность пересылать SIGTERM дочерним процессам, но в нашем случае этого не происходит. Мы хотим использовать systemd для нашей установки. Ищете способ передавать сигналы от systemd дочерним процессам.   -  person Sachin    schedule 19.04.2017


Ответы (2)


Вместо запуска самого systemd вы также можете попробовать заменить его с аналогичной функциональностью. Если вы поместите docker-systemctl-replace в качестве точки входа в контейнер, тогда он будет найдите предоставленные вами файлы модулей systemd - при запуске контейнера он запускает ExecStart из дескрипторов модуля, а после получения SIGSTOP он запускает ExecStop из каждого из дескрипторов модуля. Похоже, что это то, что вам нужно.

person Guido U. Draheim    schedule 07.06.2017

Вставьте команду запуска докера, пожалуйста.

Думаю, вам нужно добавить эти 2 варианта.

--stop-signal=SIGRTMIN+3 --env container=docker
person takaomag    schedule 25.04.2017