O comando "systemctl status" do Linux não está funcionando dentro de um contêiner Docker

2

O comando systemctl status não está funcionando. Isso nunca aconteceu. Meu contêiner está no CentOS 7. Quando emito systemctl status , recebo resultados Failed to get D-Bus connection: operation not permitted.

Regressão

  1. Analisei o upgrade do systemd. Eu removi o arquivo /etc/yum/protected.d/system.conf . Eu então usei yum remove systemd . Vejo que a versão systemd 219-19.el7_2.4 foi instalada. Eu escolho N para não remover o systemd. Eu então instalei o systemd-libs-219-19.el7_2.7.x86_64.rpm. Eu então instalei a versão 2.7 do systemd. Em seguida, usei yum remove systemd apenas para determinar a versão. Vejo que a versão systemd 219-19.el7_2.7 está instalada. Eu escolho NO para abortar a remoção. O status do systemctl ainda não funciona. Eu recebo o mesmo erro: Failed to get D-Bus connection: operation not permitted.
  2. Eu tentei criar um novo contêiner do Docker com o sinalizador -privileged . Quando usei a opção -p 80:80 , o comando de execução do Docker falhou.
  3. Quando deixei de fora a opção -p 80:80 no meu comando docker run , o novo contêiner teve o mesmo problema.
  4. Eu criei um contêiner Docker com uma opção docker run ... -v /sys/fs/cgroup:/sys/fs/cgroup:ro ". Eu tive o mesmo problema.

Espero que systemctl status funcione dentro de um contêiner do Docker.

O que devo fazer para que o systemctl status funcione em um contêiner do Docker?

    
por Kiran 14.04.2016 / 02:23

2 respostas

2

Consegui corrigir esse problema em um contêiner do CentOS: 7 Docker. Eu segui principalmente o projeto de imagem Guide on CentOS Docker .

FROM centos:7

ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

# Install anything. The service you want to start must be a SystemD service.

CMD ["/usr/sbin/init"]

Agora, crie a imagem e execute-a usando pelo menos os argumentos a seguir no comando docker run : -v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro

O ponto principal é que /usr/sbin/init deve ser o primeiro processo dentro do contêiner do Docker.

Portanto, se você quiser usar um script personalizado que execute alguns comandos antes de executar /usr/sbin/init , inicie-o no final do script usando exec /usr/sbin/init (em um script bash).

Aqui está um exemplo:

ADD cmd.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/cmd.sh

CMD ["/usr/local/bin/cmd.sh"]

E aqui está o conteúdo de cmd.sh :

#!/bin/bash

# Do some stuffs

exec /usr/sbin/init # To correctly start D-Bus thanks to https://forums.docker.com/t/any-simple-and-safe-way-to-start-services-on-centos7-systemd/5695/8

Você pode ter System is booting up. See pam_nologin(8) se estiver usando o sistema PAM, nesse caso, exclua /usr/lib/tmpfiles.d/systemd-nologin.conf no seu Dockerfile porque ele cria o arquivo /var/run/nologin que gera esse erro específico.

    
por 01.03.2017 / 15:25
0

Execute a janela de encaixe da seguinte maneira: funciona para mim

docker run -it --privileged -p 10081:80 centos7 /bin/bash
    
por 27.07.2016 / 14:31