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

时间:2015-02-13 08:29:58

标签: docker dbus systemd

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

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

  

service nginfra start

     

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

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

所以我删除fakesystemd并使用以下命令安装systemd:     yum swap - 删除fakesystemd - 安装systemd systemd-libs

但我仍然无法启动该服务:

  

service nginfra start

     

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

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

2 个答案:

答案 0 :(得分:5)

这是known issue,其中基于systemd的操作系统位于Docker容器中。

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

这是the best guide I've found for this。它使用Centos作为示例,但应该适用于任何基于systemd的操作系统。

答案 1 :(得分:5)

我设法在CentOS:7 Docker容器中解决了这个问题。 我主要关注the Guide on CentOS Docker image project

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

现在,构建映像,并至少使用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"]

以下是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

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