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

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

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

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

【问题讨论】:

    标签: docker fedora


    【解决方案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 服务文件。

      【讨论】:

        猜你喜欢
        • 2019-07-24
        • 2018-03-11
        • 1970-01-01
        • 2020-09-07
        • 2017-03-24
        • 2017-11-03
        • 2020-04-09
        • 1970-01-01
        • 2017-07-30
        相关资源
        最近更新 更多