Docker でコンテナが終了されるとき、どういう場合だとどのシグナルが送信されて、どうすれば変更ができるか。
いつもよくわからなくなるのだけど、まとめてみたら案外大したことはなかった。
先にまとめ
- コンテナを終了するときは基本的に
SIGTERM
が送信される-
SIGTERM
で終了できなかったときはSIGKILL
が送信される
-
-
kill
サブコマンドを使うと任意のシグナルをコンテナに送信できる - どのような場合でも何らかの方法で終了シグナルを変更することができる
プロセスを終了する系のシグナル
おさえておいたほうが良さそうなのだけ抜粋。
シグナル番号 | シグナル名 | キーボード入力 | 概要 |
---|---|---|---|
2 | SIGINT | Ctrl + C | キーボードからの割り込み (Interrupt) |
3 | SIGQUIT | Ctrl + / | キーボードによる中止 (Quit) |
9 | SIGKILL | 強制終了 (Kill) | |
15 | SIGTERM | 終了 (Termination) |
詳しくは: Linuxのシグナルまとめ -- ぺけみさお
Docker での各種操作とその終了シグナル
デフォルト (SIGTERM
)
- Dockerfile の
STOPSIGNAL
設定 - Docker (Compose|Swarm) での個別設定
で終了シグナルが決まる、という感じ。
Docker 単体
-
docker stop <container>
- デフォルトで
SIGTERM
が送信される - イメージの Dockerfile で
STOPSIGNAL
が設定されている場合、そのシグナルが送信される
- デフォルトで
-
docker kill <container>
- デフォルトでは
SIGKILL
が送信される -
-s, --signal <SIGNAL>
オプションを指定することで任意のシグナルを送信することができる
- デフォルトでは
Docker Compose
-
docker-compose stop <service>
- デフォルトで
SIGTERM
が送信される - docker-compose.yml で
stop_signal
が設定されている場合、そのシグナルが送信される
- デフォルトで
-
docker-compose kill <service>
- デフォルトでは
SIGKILL
が送信される -
-s <SIGNAL>
オプションを指定することで任意のシグナルを送信することができる
- デフォルトでは
-
docker-compose down <service>
-
stop
と同じ
-
Docker Swarm
-
docker service update <service>
でコンテナが更新される場合- デフォルトで
SIGTERM
が送信される - サービスに
--stop-signal <SIGNAL>
が設定されている場合、そのシグナルが送信される (service create
時に指定する、もしくはservice update
で設定する)
- デフォルトで
-
docker service scale <service>=0
(Scale Down する場合)-
update
と同じ
-