Linux
docker

Docker と POSIX シグナル

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 と同じ