DockerコンテナのプロセスはSIGTERMを受け取りません。

DockerコンテナのプロセスはSIGTERMを受け取りません。

Dockerコンテナで実行される単純なPythonプロセスがあります。

ドッカーファイル:

FROM ubuntu:18.04
RUN apt -y update && apt -y install python3
COPY app.py /app/
WORKDIR /app
ENTRYPOINT ["./app.py"]

application.py:

#!/usr/bin/env python3

if __name__ == '__main__':
    while True:
        pass

それは非常にうまく動作します。しかし、プロセスがSIGTERM.IEの影響を受けないことがわかりました。

# In container
kill -s TERM `pgrep python3`

何もしませんでした。しかし、

kill -s INT `pgrep python3`

KeyboardInterrupt予想通り、このプロセスでaが発生しました。

私は走った

grep Sig /proc/`pgrep python3`/status

コンテナに入る

SigQ:   1/127222
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001001000
SigCgt: 0000000180000002

SIGTERM私はすでに15歳ですが、なぜまだ合格できませんでしたか?私のホスト(またUbuntu)でPythonスクリプトを実行すると、期待SIGTERMどおりに終了します。

答え1

Dockerコンテナにはプロセスがないため、initPythonプロセスはPID 1として実行されます。 ~によるとman 2 kill

プロセスID 1(つまり、initプロセス)に送信できる唯一の信号は、initに明示的なシグナルハンドラがインストールされているシグナルです。これは、システムが予期せずクラッシュしないようにするために行われます。

これはSIGINT、Pythonがシグナルのハンドラを登録するために機能します。したがって、次のようにすることができます。

#!/usr/bin/env python3

import signal

def handler(signum, frame):
    print('Exiting')
    exit(0)

if __name__ == '__main__':
    signal.signal(signal.SIGTERM, handler)
    while True:
        pass

あるいは、Dockerにプロセスを使用してコンテナを実行するように指示することもできますinit

docker run -it --init my_image

関連情報