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コンテナにはプロセスがないため、init
Pythonプロセスは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