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

Dun*_*ill 104 server systemd docker 16.04

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

systemctl status ssh
Run Code Online (Sandbox Code Playgroud)

但是我收到错误...

Failed to connect to bus: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

use*_*505 71

我假设你用类似的东西启动你的 docker 容器

docker run -t -i ubuntu:16.04 /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

除此之外,您缺少 dbus 将是沟通的方式。这是您的错误消息的来源。但是由于您的 PID 1 不是 systemd,因此安装 dbus 无济于事。

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


Win*_*nix 19

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

$ env
Run Code Online (Sandbox Code Playgroud)

你看到这样的环境变量了吗?

XDG_RUNTIME_DIR=/run/user/`id -u`
Run Code Online (Sandbox Code Playgroud)

Whereid -u用反引号而不是单引号括起来。这个变量通常被重新解释为一个数字,通常1000用于普通用户和0超级用户 (sudo)。

如果环境变量XDG_RUNTIME_DIR不存在,则需要创建它。完整的讨论在启动板 systemd 答案中

  • @Roeland 是的。我在 SO 上问了一个 [similar question](http://stackoverflow.com/questions/39169403/systemd-and-systemctl-within-ubuntu-docker-images),得到了更强烈的回应。此外,我建议您在 Docker 网站上观看自学教程。在这些视频中解释了(稍微含糊地)如何在 Docker 容器中用容器 **Entrypoint** 替换通常是“systemd”的“PID 1”。 (3认同)
  • 我试过这个没有成功。由于我的 Ubuntu 16.04 实例具有 docker 容器的形式,而且我还没有设置任何以“root”身份工作的用户,因此我使用了变量“XDG_RUNTIME_DIR=/run/root/0”,但没有成功。然后我检查了文件夹`/run`,发现没有子文件夹`/run/root`。无论如何,我可以获得更详细的错误消息吗?我查看了 `systemctl --help`,但看不到获取详细错误消息的方法。 (2认同)

小智 10

只需启动dbus服务:

/etc/init.d/dbus start
Run Code Online (Sandbox Code Playgroud)


iju*_*ath 7

如果您在适用于 Linux 的 Windows 子系统 (WSL) 中遇到此错误,我发现这是因为 Docker 不受支持。这是由于缺乏 cgroup 和其他先决条件。