Рассмотрим следующее, которое запускает sleep 60
в фоновом режиме, а затем завершает работу:
$ cat run.sh
sleep 60&
ps
echo Goodbye!!!
$ docker run --rm -v $(pwd)/run.sh:/run.sh ubuntu:16.04 bash /run.sh
PID TTY TIME CMD
1 ? 00:00:00 bash
5 ? 00:00:00 sleep
6 ? 00:00:00 ps
Goodbye!!!
Это запустит контейнер Docker с bash
в качестве PID1. Затем он разветвляет/выполняет процесс sleep
, а затем bash
завершает работу. Когда контейнер Docker умирает, процесс sleep
тоже каким-то образом умирает.
Мой вопрос: каков механизм уничтожения процесса sleep
? Я попытался перехватить SIGTERM
в дочернем процессе, и, похоже, это не сработало. Я предполагаю, что что-то (либо Docker, либо ядро Linux) отправляет SIGKILL
при завершении работы cgroup, которую использует контейнер, но я нигде не нашел документации, разъясняющей это.
EDIT Ближе всего к объяснению я пришел к следующей цитате из baseimage- докер:
Если ваш процесс инициализации является вашим приложением, то он, вероятно, выключится только сам, а не все другие процессы в контейнере. Затем ядро принудительно убивает эти другие процессы, не давая им возможности корректно завершить работу, что может привести к повреждению файлов, устаревшим временным файлам и т. д. Вы действительно хотите корректно завершить все свои процессы.
Таким образом, по крайней мере, согласно этому, подразумевается, что при выходе из контейнера ядро отправит SIGKILL всем оставшимся процессам. Но мне все же хотелось бы ясности в том, как это решается (т. е. является ли это особенностью cgroups?), и в идеале было бы неплохо иметь более авторитетный источник.