Docker上のPython3でSIGTERMを受け取る

Docker, docker-composeでコンテナを終了するときに、実行中のPythonソフトウェアに特定の処理をさせたい。POSIXシグナル(今回はSIGTERM)を受け取ってあげればできそう。

しばらくしたらやり方を忘れていそうなので、ここにメモ。

追記: docker-compose にstop_signalを設定すれば、KeyboardInterruptでキャッチできるかも

SIGTERMを受け取りたい

docker stop
docker-compose down

上のコマンドを実行すると、コンテナ内でSIGTERMが送信されます。

参考: Docker と POSIX シグナル – Qiita

なので、そのシグナルを受け取って処理すればいい感じ。Python3では、標準モジュールであるsignalモジュールでシグナルを扱えるらしいです。公式ドキュメントに用例も載ってるので、サクッといけそう。

ちなみに、docker-compose runでCtrl+CするとKeyboardInterrupt例外が上がりますが、docker-compose upでCtrl+CするとSIGTERMが送出されます。考えれば当たり前です。

https://docs.python.org/ja/3/library/signal.html

上記の公式のものそのまんまでいけそうです。今回は用途に合わせてもっと簡略化。

ハンドラの第二引数のframeが何かわからない…

import signal, sys

# ハンドラを定義
def sigterm_handler(signum, frame):
    print('Signal handler called with signal', signum)
    ~~~~~
    なにか処理
    ~~~~~
    sys.exit()

# ハンドラをセット
signal.signal(signal.SIGTERM, sigterm_handler)

たぶんこれで動きます。

かず猫

インターネット初心者です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください