systemctl 无法连接到总线-docker ubuntu:16.04 容器

systemctl 无法连接到总线-docker ubuntu:16.04 容器

我正在尝试在 Docker 容器systemctl中使用该命令ubuntu:16.04。我正在运行以下命令...

systemctl status ssh

但是我收到了错误...

Failed to connect to bus: No such file or directory

为什么这不起作用?这与在 Docker 容器中运行的 Ubuntu 有关吗?我怎样才能systemctl正常工作?

答案1

我假设你用类似下面的命令启动你的d​​ocker容器

docker run -t -i ubuntu:16.04 /bin/bash

现在的问题是您的 init 进程 PID 1 是/bin/bash,而不是 systemd。请使用 确认ps aux

除此之外,您还缺少 dbus,这是通信方式。这就是您的错误消息的来源。但由于您的 PID 1 不是 systemd,因此安装 dbus 不会有帮助。

最好重新考虑你计划使用docker的方式。不要依赖systemd作为进程管理器,而是让docker容器在前台运行你想要的应用程序。

答案2

其他人也报告了类似的问题。启动终端并输入:

$ env

您看到过这样的环境变量吗?

XDG_RUNTIME_DIR=/run/user/`id -u`

其中,id -u括号内是反引号,而不是单引号。此变量通常被重新解释为数字,1000供普通用户和0超级用户 (sudo) 使用。

如果环境变量XDG_RUNTIME_DIR不存在,则需要创建它。完整讨论请参见launchpad systemd 答案

答案3

只需启动dbus服务:

/etc/init.d/dbus start

答案4

尝试这个:

docker run -ti -d --privileged=true images_docker  "/sbin/init"

或者

docker run -ti -d --privileged=true images_docker

将会得到相同的结果。

我从这里得到Docker 文档

默认情况下,Docker 容器是“无特权的”,例如,无法在 Docker 容器内运行 Docker 守护程序。这是因为默认情况下,容器不允许访问任何设备,但“特权”容器可以访问所有设备(请参阅 cgroups 设备文档)。

当操作员执行 docker run --privileged 时,Docker 将启用对主机上所有设备的访问,并在 AppArmor 或 SELinux 中设置一些配置,以允许容器几乎与在主机上的容器外部运行的进程一样访问主机。有关使用 --privileged 运行的更多信息,请参阅 Docker 博客。

相关内容