Não é possível matar o processo com o PID 1 no contêiner docker

3

Eu tenho o Dockerfile a seguir para criar um contêiner com um recursor powerdns:

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

Meu recursor.conf é assim:

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

O IPv6 está desativado no hipervisor.

O problema é que a janela de encaixe não pode parar o contêiner adequadamente com docker stop recursor . Após algum tempo, o OOMKiller encerra o programa com as seguintes informações:

Exited (137) 2 seconds ago

Eu pesquisei na web e os sinais 128 + 9 = 137 significam que eu não tenho RAM suficiente, o que simplesmente não é o caso. Quando executo docker exec -it recursor /bin/bash e tento matar o PID 1 ( kill -9 -- 1 ) dentro do contêiner, não obtenho nenhuma reação - o serviço simplesmente continua a funcionar como se nada tivesse acontecido.

Eu também tentei iniciar o recursor no modo daemon - mesmo resultado.

Alguém tem uma ideia de por que isso acontece?

    
por chevallier 21.07.2018 / 15:41

1 resposta

5

O processo com o PID 1 é o processo init. Isso permanece verdadeiro em um namespace pid ou em um container: este pid 1 não pode ser eliminado com SIGKILL porque ele não tem nenhum manipulador de sinal KILL definido, ao contrário de qualquer outro processo userland.

Se você realmente quer matá-lo, você tem que matá-lo do host . Rodando no host (com privilégios suficientes, provavelmente root):

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

Isso derrubará todo o contêiner, pois a remoção do PID 1 significa parar o contêiner. Por favor, note que eu respondi ao título da pergunta, mas não ao problema subjacente: o que está causando OOM.

UPDATE: provavelmente, é mais simples de usar docker kill , cujo padrão é o sinal KILL . Isso seria:

docker kill containername

UPDATE2: convence que o PID 1 não pode ser eliminado com SIGKILL (também conhecido como -9 ), mesmo em um contêiner (o exemplo requer que o namespace do usuário seja ativado, use apenas unshare --mount-proc --fork --pid como root) .

primeiro terminal:

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

sem efeito

Em um segundo terminal:

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

primeiro terminal:

# Killed
$ 
    
por 21.07.2018 / 15:57