この機能は docker/docker#26061 で実装された。
--init をつけた場合に実行されるバイナリ(/dev/init)の実態は
docker/docker#28037 により krallin/tini に変更されている。
python で time.sleep(100)するだけのコンテナを docker run
で実行し、そのコンテナに対して docker stop
した場合に --init 有り無しで違いがあるかを比較してみる。
下記のコマンド実行結果より
- PID 1 が python になっていることがわかる。
- 停止に10秒かかっているが、docker stop がデフォルトで10秒で SIGKILL を送り強制的に止めてしまうため。
- つまり、このプロセスは SIGTERM で停止処理されたわけではなく SIGKILL で強制停止されている。これは、該当プロセスに(外部などから)strace するとわかる。
[mapk0y@kona:~]$ docker run -d --name 'init-test' python python -c 'import time; time.sleep(100)'
4d43e54add5e690ac1464213e6c7197663c639c6d40f757cd50da05f23a1b46d
[mapk0y@kona:~]$ docker ps -f name=init-test --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d43e54add5e690ac1464213e6c7197663c639c6d40f757cd50da05f23a1b46d python "python -c 'import time; time.sleep(100)'" 21 seconds ago Up 21 seconds init-test
[mapk0y@kona:~]$ docker exec -t init-test ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 7 0.0 0.0 19184 2428 ? Rs+ 10:08 0:00 ps auxf
root 1 0.0 0.0 24372 9172 ? Ss 10:07 0:00 python -c impor
[mapk0y@kona:~]$ time docker stop init-test
init-test
real 0m10.199s
user 0m0.008s
sys 0m0.000s
[mapk0y@kona:~]$ docker rm init-test
init-test
下記のコマンド実行結果より
- PID 1 が /dev/init になっていることがわかる(このパスは PullRequest で指摘があったがスルーされてる?)。
- 停止に1秒もかかっていない。
- つまり、このプロセスは SIGTERM で停止処理されている。これは、該当プロセスに(外部などから)strace するとわかる。
[mapk0y@kona:~]$ docker run --init -d --name 'init-test' python python -c 'import time; time.sleep(100)'
f95b4f23a8659b5fc2e13138d49b236ce00e7e331ae2896ae0f2f4053e43db33
[mapk0y@kona:~]$ docker ps -f name=init-test --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f95b4f23a8659b5fc2e13138d49b236ce00e7e331ae2896ae0f2f4053e43db33 python "python -c 'import time; time.sleep(100)'" 4 seconds ago Up 3 seconds init-test
[mapk0y@kona:~]$ docker exec -t init-test ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 8 0.0 0.0 19184 2428 ? Rs+ 10:09 0:00 ps auxf
root 1 0.0 0.0 1056 4 ? Ss 10:09 0:00 /dev/init pytho
root 7 0.5 0.0 24372 9144 ? S 10:09 0:00 python -c impor
[mapk0y@kona:~]$ time docker stop init-test
init-test
real 0m0.199s
user 0m0.004s
sys 0m0.004s
[mapk0y@kona:~]$ docker rm init-test
init-test
[mapk0y@kona:~]$ docker exec -t init-test /dev/init --version
tini version 0.13.0 - git.949e6fa