【问题标题】:Failed to get D-Bus connection: Operation not permitted获取 D-Bus 连接失败:不允许操作
【发布时间】:2018-10-27 20:16:25
【问题描述】:

我正在尝试在 docker centos7 映像上安装 ambari 2.6,但在 ambari 设置步骤中,并且恰好在初始化 postgresql 数据库时收到此错误:

获取 D-Bus 连接失败:不允许操作

每次我尝试在我的 docker 映像上运行服务时都会遇到此错误。

我尝试了网络中的所有解决方案,但都没有奏效。

有人知道如何解决这个问题吗?

提前谢谢你

【问题讨论】:

    标签: docker centos7 docker-machine ambari docker-image


    【解决方案1】:

    使用这个命令

    docker run -d -it --privileged {Image ID} /usr/sbin/init
    

    并在容器中访问root

    systemctl start httpd.service
    

    这应该可行!

    【讨论】:

    • 我猜它不再起作用了:我收到这个错误:C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:348: star ting container process caused "exec: \"C:/Program Files/Git/usr/sbin/init\": stat C:/Program Files/Git/usr/sbin/init: no such file or direct ory": unknown.
    • ContainerId 应该是 ImageId
    • 作为菜鸟,我不确定如何“访问容器中的根目录”:docker exec -it CONTAINER bash
    • 这是一个临时解决方案,因为我们不能每次都在 privileged 模式下运行容器
    【解决方案2】:

    详细说明@Guido 的answer,对我有用的是从here 复制systemctl.py 并将其放在与我的Dockerfile 相同的目录中,然后将以下内容添加到我的Dockerfile

    COPY systemctl.py /usr/bin/systemctl
    RUN chmod a+x /usr/bin/systemctl
    

    例如,这让我可以像这样启动sshd 服务:

    service sshd start
    

    【讨论】:

    • 这个解决方案对我有用。我使用此systemctl.py 构建了 docker 映像,并且成功了。我对该文件中写入的逻辑一无所知,但它允许我们在 docker 映像中使用 systemctl
    【解决方案3】:

    运行这个命令:

    docker run -it -p 1001:25 --name postfix1 --privileged -d   --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro postfix
    

    【讨论】:

      【解决方案4】:

      在 Centos7 上,所有服务都是通过 systemd 守护进程启动和停止的。 systemctl 命令将简单地尝试通过使用 d-bus 通道与守护进程对话 - 这就是消息的来源。

      您也可以尝试docker-systemctl-replacement 来避免这种情况,而不是在特权模式下运行容器(因此它不是真正包含的)。

      【讨论】:

      • 它不能以正常方式与守护进程通信吗,例如 unix 套接字?还是只运行一次以启动该过程,然后就是这样?
      • “只运行进程并分离”......这就是替换脚本所做的。 systemd 守护进程的工作方式完全不同,因为服务是子服务,因此它可以监视它们的存在,并且 systemd 也会知道它们的退出代码 - 默认的 Restart=on-failure 取决于此。 // 使用 unix 套接字,这根本不是它的实现方式。不是我的选择。
      • 如果不可能,这是 systemd 的主要缺失功能。这是一个非常重要的能力。我在制作自己的流程管理器方面做了很多工作。让它们运行一次然后退出或将其包装在一个迷你进程中或运行常驻并管理或监督一个或多个进程真的不难。这种事情本身可能会成为一个很好的问题。没有很好的理由。你告诉 systemd 如何开始事情,但这听起来像是与其他事情相结合,所以你不能只开始一个标准设计失败的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      相关资源
      最近更新 更多