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