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
)を強制終了しようとすると、何の反応もありません。サービスは、何も起こらなかったかのように実行を続けます。
また、デーモンモードでリカーサーを起動しようとしました-同じ結果。
なぜそうなのか誰かが知っていますか?
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
$