Skip to content

Instantly share code, notes, and snippets.

@mapk0y
Last active July 11, 2022 22:58
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mapk0y/3342ee187b11b0c05b168761761331bd to your computer and use it in GitHub Desktop.
Save mapk0y/3342ee187b11b0c05b168761761331bd to your computer and use it in GitHub Desktop.
docker run の --init をつけた場合(Docker 1.13 以降)

docker 1.13 以降使えるようになった docker run --init についての調査

この機能は docker/docker#26061 で実装された。
--init をつけた場合に実行されるバイナリ(/dev/init)の実態は docker/docker#28037 により krallin/tini に変更されている。

調査方法

python で time.sleep(100)するだけのコンテナを docker run で実行し、そのコンテナに対して docker stop した場合に --init 有り無しで違いがあるかを比較してみる。

--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

--init をつけた場合

下記のコマンド実行結果より

  • 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment