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에 명시적인 신호 처리기가 설치된 신호입니다. 이는 시스템이 예기치 않게 충돌하지 않도록 하기 위해 수행됩니다.

이는 SIGINTPython이 신호에 대한 핸들러를 등록하기 때문에 작동합니다. 따라서 다음과 같이 할 수 있습니다.

#!/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

관련 정보