在 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下构建centos7容器无法使用systemctl命令的解决办法
Docker容器systemctl启动服务报错Failed to get D-Bus connection: Operation not permitted