在 fedora 容器中 systemctl 给出 Failed to get D-Bus connection

Posted

技术标签:

【中文标题】在 fedora 容器中 systemctl 给出 Failed to get D-Bus connection【英文标题】:In fedora container systemctl gives Failed to get D-Bus connection 【发布时间】:2015-04-24 01:58:35 【问题描述】:

当我在一个 Fedora 容器中使用 systemctl 时,我得到:

获取 D-Bus 连接失败:: 未知错误 -1

有人知道如何解决这个问题吗?或者 systemctl 不能在 docker 容器中使用吗?

【问题讨论】:

【参考方案1】:

systemctl 命令通过 DBus 连接与systemd 通信。您不太可能在容器中运行systemd,因此systemctl 无话可说。

虽然可能在容器中运行systemd,但这样做通常(但并非总是!)表明您需要重新考虑容器的架构。

【讨论】:

确实,systemd 没有运行。现在我明白错误了!为什么在容器中使用 systemctl 不好?因为例如代替systemctl enable sshd,我必须先做ssh-keygen -A,然后再做/usr/sbin/sshd 在容器内运行服务管理器会隐藏主机的服务错误(例如,“sshd crashed”),这反过来又使高级编排工具(如 kubernetes,甚至 systemd on主机)来管理事情。这也使得有人更有可能将一堆不相关的服务塞进一个容器中,这最终会使它们更难扩展。【参考方案2】:

我已经修复了一个类似的问题,请查看this answer。

主要思想是让/usr/sbin/init成为容器内的第一个进程

【讨论】:

【参考方案3】:

如前所述,标准 systemctl 需要 SystemD。但是对于像“systemctl enable”这样的命令或启动服务进程,实际上是在没有运行 SystemD 的情况下这样做的。

“systemctl enable”本质上会在 sshd.service 文件中查找“WantedBy=multi-user.target”子句,然后在 /etc/systemd/system/multi-user.target.wants 中创建符号链接/。同样,“systemctl start”将在 ssh.service 文件中查找“ExecStart=/usr/bin/sshd”子句。

如果您不想查看并手动运行这些部分,您可以使用我来自 docker-systemctl-replacement 的 systemctl.py 助手,它可以为您解释 systemd 服务文件。

【讨论】:

以上是关于在 fedora 容器中 systemctl 给出 Failed to get D-Bus connection的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器Centos不能使用systemctl命令问题

来自 docker 容器内部的 systemctl 因 D-Bus 连接错误而失败

docker学习:Fedora容器

docker学习:Fedora容器

Docker下构建centos7容器无法使用systemctl命令的解决办法

Docker容器systemctl启动服务报错Failed to get D-Bus connection: Operation not permitted