web-dev-qa-db-ja.com

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 = 137は、十分なRAMがないことを意味しますが、実際にはそうではありません。 docker exec -it recursor /bin/bashを実行してコンテナー内でPID 1(kill -9 -- 1)を強制終了しようとすると、何の反応もありません。サービスは、何も起こらなかったかのように実行を続けます。

また、デーモンモードでリカーサーを起動しようとしました-同じ結果。

なぜそうなのか誰かが知っていますか?

9
manifestor

PID 1のプロセスは、initプロセスです。 any 他のユーザーランドプロセスとは異なり、SIGKILLシグナルハンドラが定義されていないため、このpid 1はKILLで強制終了できません。

あなたが本当にそれを殺したいなら、あなたはそれを Host から殺さなければなりません。ホスト上での実行(十分な権限、おそらくrootで):

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

PID 1を削除するとコンテナーが停止するため、これによりコンテナー全体がダウンします。質問のタイトルには答えましたが、根本的な問題には答えませんでした。OOMの原因は何ですか。

更新:おそらく docker kill 、デフォルトはKILL信号です。それは:

docker kill containername

UPDATE2:PID 1はSIGKILL(別名-9)、 even をコンテナーに入れます(この例ではユーザーの名前空間を有効にする必要があります。それ以外の場合はunshare --mount-proc --fork --pid(ルートとして)。

最初のターミナル:

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

無効

2番目の端末:

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

最初のターミナル:

# Killed
$ 
15
A.B