在docker容器中启动服务失败,错误:无法获得D-Bus连接:没有与服务管理器的连接

bao*_*nru 9 dbus systemd docker

我安装了docker image并成功构建了一个图像.

当我ssh到容器并运行命令时service xxx start,弹出一个错误:

服务nginfra开始

重定向到/ bin/systemctl start nginfra.service/sbin/service:第79行:/ bin/systemctl:没有这样的文件或目录

实际上,fakesystemd安装在容器而不是systemd.

所以我删除fakesystemd并安装systemd了命令:yum swap - remove fakesystemd - install systemd systemd-libs

但我还是无法启动服务:

服务nginfra开始

重定向到/ bin/systemctl start nginfra.service无法获得D-Bus连接:没有与服务管理器的连接.

有没有人见过并解决过这个问题?

Ant*_* O. 6

我已经设法在CentOS:7 Docker容器中解决了这个问题.我主要遵循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"]
Run Code Online (Sandbox Code Playgroud)

现在,构建映像,并至少使用以下参数来运行它docker run:-v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro

那么要点是/usr/sbin/init必须是Docker容器中的第一个进程.

因此,如果要在运行之前使用执行某些命令的自定义脚本,/usr/sbin/init请使用exec /usr/sbin/init(在bash脚本中)在脚本末尾启动它.

这是一个例子:

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

CMD ["/usr/local/bin/cmd.sh"]
Run Code Online (Sandbox Code Playgroud)

以下是以下内容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
Run Code Online (Sandbox Code Playgroud)

System is booting up. See pam_nologin(8)如果您使用PAM系统,那么您可能会在您的系统中删除/usr/lib/tmpfiles.d/systemd-nologin.conf,Dockerfile因为它会创建/var/run/nologin生成此特定错误的文件.


oce*_*ean 5

这是已知问题systemdDocker容器内部的基于操作系统。

简短的答案:以及替换fakesystemdsystemd您需要将/sys/fs/cgroup只读卷附加到容器中,构建映像,然后以“特权”模式运行它。

这是我为此找到的最佳指南。它以Centos为例,但应与任何systemd基于OS的操作系统一起使用。