Prozess mit PID 1 im Docker-Container kann nicht abgebrochen werden

9

Ich habe die folgende Docker-Datei zum Erstellen eines Containers mit einem PowerDNS-Recursor:

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"]

Mein recursor.confsieht so aus:

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 ist auf dem Hypervisor deaktiviert.

Das Problem ist, dass Docker den Container mit nicht richtig stoppen kann docker stop recursor. Nach einiger Zeit beendet der OOMKiller das Programm mit folgenden Informationen:

Exited (137) 2 seconds ago

Ich habe im Internet gesucht und die Signale 128+ 9= 137bedeuten, dass ich nicht genügend RAM habe, was einfach nicht der Fall ist. Wenn ich docker exec -it recursor /bin/bashPID 1 ( kill -9 -- 1) innerhalb des Containers ausführe und versuche, es zu beenden, bekomme ich keine Reaktion - der Dienst läuft einfach weiter, als wäre nichts passiert.

Ich habe auch versucht, den Recursor im Daemon-Modus zu starten - das gleiche Ergebnis.

Hat jemand eine Idee warum das so ist?

Manifestator
quelle

Antworten:

15

Prozess mit PID 1 ist der Init-Prozess. Dass Aufenthalte wahr in einem pid Namespace oder einen Container: Diese pid 1 kann nicht mit getötet werden , SIGKILLweil sie keine hat KILLSignal - Handler definiert, im Gegensatz zu jedem anderen Userland - Prozess.

Wenn du es wirklich töten willst, musst du es vom Host töten . Laufen auf dem Host (mit genügend Berechtigungen, wahrscheinlich root):

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

Dadurch wird der gesamte Container heruntergefahren, da das Entfernen der PID 1 das Stoppen des Containers bedeutet. Bitte beachten Sie, dass ich auf den Titel der Frage geantwortet habe, aber nicht auf das zugrunde liegende Problem: Was verursacht OOM?

UPDATE: wahrscheinlich einfacher zu bedienen docker kill, standardmäßig das KILLSignal. Das wäre:

docker kill containername

UPDATE2: Überzeugen Sie, dass PID 1 auch in einem Container nicht mit SIGKILL(aka -9) getötet werden kann (im Beispiel muss der Benutzername aktiviert sein, andernfalls wird er nur als Root verwendet).unshare --mount-proc --fork --pid

erstes Terminal:

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

keine Wirkung

Auf einem zweiten Terminal:

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

erstes Terminal:

# Killed
$ 
AB
quelle
Danke, aber dem würde ich nicht zustimmen. Ich kann andere Container töten, die sich in der Containerausgabe befinden kill -- 1(PID 1), und sie werden sofort gestoppt. Auch wenn ich docker stop containervon außen herauskomme, hören sie sofort auf. Ich weiß über das Rough docker kill containerBescheid und ich weiß, dass ich ihn mit seiner PID vom Host töten kann, aber das ist nicht der Kern dieser Angelegenheit.
Manifest
Du hast gesagt, töte -9 - 1. Probieren Sie es in einem Container aus: speziell mit dem Signal -9. Diejenigen, die sich korrekt verhalten, können mit jedem anderen beabsichtigten Signal (z. B. -15 / -TERM, Standardeinstellung oder für einen echten Init-Prozess (keine App), -2 / -INT) getötet werden, entweder weil sie es nicht abfangen ( und das Todesverhalten erhalten), entweder weil sie es abfangen, sich aber richtig verhalten.
AB
Ja, Sie hatten Recht, -9funktioniert nicht für PID 1. Aber ich muss noch herausfinden, warum ich Exited (137)mit einem normalen docker stop:)
Manifest
Sauberer Weg, um Host-PID von Container-PID 1 zu erhalten:docker inspect --format '{{.State.Pid}}' containername
Mviereck
@ Mviereck danke, änderte meine Antwort entsprechend
AB