【问题标题】:Start a service in docker container failed,with error: Failed to get D-Bus connection: No connection to service manager在 docker 容器中启动服务失败,出现错误:无法获得 D-Bus 连接:没有连接到服务管理器
【发布时间】:2015-04-14 05:50:47
【问题描述】:

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

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

服务 nginfra 启动

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

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

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

但是我还是无法启动服务:

服务 nginfra 启动

重定向到 /bin/systemctl start nginfra.service 获取失败 D-Bus 连接:未连接到服务管理器。

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

【问题讨论】:

  • 请学习如何格式化帖子以使其他人可读。
  • 如果您共享您的 Dockerfile,其他人可能会更容易提供帮助

标签: docker dbus systemd


【解决方案1】:

这是known issue 在 Docker 容器中带有基于 systemd 的操作系统。

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

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

【讨论】:

  • 所以如果你在 Mac 或 Windows 上运行 Docker,那么你基本上搞砸了??? :(
  • @jerseybean 不,这个问题与在 Docker 容器内运行的操作系统有关,与运行容器的主机类型无关。
  • 这在 Windows docker 环境中对我不起作用(使用 RHEL 和 CentOS 作为容器操作系统)。
【解决方案2】:

我已经设法在 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),在这种情况下,请删除您的 Dockerfile 中的 /usr/lib/tmpfiles.d/systemd-nologin.conf,因为它会创建文件 /var/run/nologin,从而生成此特定错误。

【讨论】:

  • 来自github.com/docker/docker/issues/7459#issuecomment-283888347,有价值的信息。阅读指南并尝试使用 centos7&Dockerfile,同样的错误并没有消失。看来我的 docker 版本 1.12 太旧了,我放弃并回退到run --privillaged
  • 不知道为什么,但在我的情况下它似乎仍然失败 - 请参阅 github.com/moby/moby/issues/7459#issuecomment-341907198 Failed to get D-Bus connection: Operation not permitted[!!!!!!] Failed to mount API filesystems, freezing.
  • @loretoparisi 我在忘记将-v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro 添加到docker run 时收到此消息,您收到了吗?
猜你喜欢
  • 2014-10-27
  • 2016-04-05
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 2018-02-08
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多