Docker 컨테이너에서 PID 1을 사용하여 프로세스를 종료할 수 없습니다.

Docker 컨테이너에서 PID 1을 사용하여 프로세스를 종료할 수 없습니다.

powerdns 반복자가 포함된 컨테이너를 생성하기 위한 다음 Dockerfile이 있습니다.

FROM debian:stretch-slim
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \
    apt-get install --no-install-recommends -y \
    pdns-recursor && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean
COPY ./configuration/recursor.conf /etc/powerdns/recursor.conf
RUN chown -R :pdns /etc/powerdns/ && \
    chmod 0750 /etc/powerdns/ && \
    chmod 0640 /etc/powerdns/recursor.conf
EXPOSE 8699
ENTRYPOINT ["/usr/sbin/pdns_recursor", "--daemon=no"]

recursor.conf모습은 다음과 같습니다.

config-dir=/etc/powerdns
forward-zones=resolver1.opendns.com=208.67.222.222
hint-file=/usr/share/dns/root.hints
local-address=0.0.0.0
local-port=8699
quiet=yes
security-poll-suffix=
setgid=pdns
setuid=pdns

하이퍼바이저에서 IPv6이 비활성화되어 있습니다.

문제는 docker가 컨테이너를 제대로 중지할 수 없다는 것입니다 docker stop recursor. 잠시 후 OOMKiller는 프로그램을 종료하고 다음 메시지를 제공합니다.

Exited (137) 2 seconds ago

128신호 + 9=는 RAM이 충분하지 않다는 것을 온라인에서 검색했지만 137그렇지 않습니다. 컨테이너 내부에서 PID 1()을 실행 docker exec -it recursor /bin/bash하고 종료하려고 하면 아무 일도 일어나지 않습니다. 서비스는 아무 일도 일어나지 않은 것처럼 계속 실행됩니다.kill -9 -- 1

또한 데몬 모드에서 재귀 프로그램을 시작해 보았습니다. 결과는 동일했습니다.

왜 이런 일이 일어나는지 아는 사람이 있나요?

답변1

PID 1의 프로세스가 init 프로세스입니다. 이는 pid 네임스페이스나 컨테이너 내에서도 여전히 적용됩니다. 이 pid 1은 신호 처리기가 정의되어 SIGKILL있지 않기 때문에 종료될 수 없습니다.KILL어느기타 사용자 모드 프로세스.

정말 죽이고 싶으면 죽여야지호스트에서. 호스트 컴퓨터에서 실행합니다(충분한 권한, 아마도 루트 사용).

kill -KILL $(docker inspect --format '{{.State.Pid}}' containername)

PID 1을 삭제하면 컨테이너가 중지되므로 전체 컨테이너가 종료됩니다. 나는 질문 제목에 답변했지만 기본 질문인 OOM의 원인에 대해서는 답변하지 않았습니다.

업데이트: 사용하기 더 쉬울 수도 있습니다.docker kill, 기본값은 KILL신호입니다. 그것은 다음과 같습니다:

docker kill containername

업데이트 2: PID 1이 종료될 수 없는지 확인하세요 SIGKILL(일명 -9).심지어컨테이너에서(이 예에서는 사용자 네임스페이스를 활성화해야 합니다. 그렇지 않으면 unshare --mount-proc --fork --pid루트만 사용됩니다).

첫 번째 터미널:

$ unshare --map-root-user --mount-proc --fork --pid
# echo $$
1
# pstree -p
bash(1)---pstree(88)
# kill -9 1
#

효과 없음

두 번째 터미널에서:

$ pstree -p $(pidof unshare)
unshare(2023)───bash(2024)
$ kill -9 2024

첫 번째 터미널:

# Killed
$ 

관련 정보