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


72

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

systemctl status ssh

但是我遇到了错误...

Failed to connect to bus: No such file or directory

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


2
使用service ssh start
Bidyut

Answers:


50

我假设您使用类似以下内容启动docker容器

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

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

除此之外,您还缺少dbus与之沟通。这是您的错误消息的来源。但是由于您的PID 1没有systemd,因此无助于安装dbus。

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


将诸如openssh-server之类的服务配置为登录到默认的syslog工具。如何不依赖systemctl来获取sshd日志?
Parth Shah

@ParthShah请查看sshd手册页。我的有以下选择:通过用-D校准,可以将其保持在前台。使用-e指示它直接打印日志。然后可以使用docker方法检查这些docker log
user228505 '18 -10-8

[FYI] /sbin/init正在被PID = 1进程接收到此错误。--privileged=true根据@sonjaya sonjaya的建议添加以下内容即可解决此问题。
DimG

漂亮的答案!!
Sachin Verma

11

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

$ env

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

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

id -u用反引号不是单引号。通常1000对于普通用户和0超级用户(sudo),此变量都会重新解释为数字。

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


2
我没有成功尝试过。由于我的Ubuntu 16.04实例具有docker容器的形式,并且我尚未设置正在使用的任何用户root,因此我使用了变量XDG_RUNTIME_DIR=/run/root/0,但没有成功。然后我检查了文件夹/run,发现没有子文件夹/run/root。无论如何,我可以获得更详细的错误消息吗?我看了一下,systemctl --help但是看不到获取详细错误消息的方法。
Duncan Gravill '16

1
我遇到了同样的问题,但这也没有解决我的问题。你有没有想过这一点@DuncanGravill
Roeland

3
@Roeland是的。我对SO 提出了类似的问题,它的回应更为强烈。另外,我建议您在Docker网站上观看自定进度教程。在这些视频中(略微含糊地)说明了PID 1通常如何systemd在Docker容器中用容器Entrypoint替换后者
Duncan Gravill '16

太好了,谢谢!我需要它来从系统单元启动/管理用户单元。
阿德里安·昆特

5

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


3

尝试这个:

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 Blog。


2
您能解释一下您的命令和所接受问题的区别吗?
Melebius

欢迎来到AskUbuntu!感谢您的帮助!快速阅读文档会使我相信您可能在此命令中犯了一个错误或错误2。如果您愿意编辑它并解释您在做什么以及它如何解决该问题,请联系我,我会回来给您投票!
极客长老'18

当您说images_docker时,您的意思是香草ubuntu:16.04?或者是其他东西?
Parth Shah

1

您可能没有运行systemd,这是16.04 上init的默认实现。如果从14.04升级,则很可能仍在运行upstart,并且运行systemctl命令的结果是得到的输出。

请参阅我在systemctl上的回答:comand not found 16.04 server for more。


但这是一个Ubuntu容器,默认情况下它没有systemd,也没有暴发户。
Stefan Lasiewski

什么?ubuntu默认情况下是systemd
knocte

Stefan:我相信您对Docker是正确的。
休·邦图

声明:我的评论涉及从14.04(Upstart)升级到16.04(systemd)的情况。执行版本升级时,出于可以理解的原因(例如:不破坏系统),Upstart不会被systemd取代。回想起来,我意识到在Docker中不会使用版本升级过程。看到我呼出的链接。我看到许多答案和评论都没有考虑到Docker的具体情况,以后我会在寻找答案时加以考虑。
休·邦图

1

只需启动dbus服务:

/etc/init.d/dbus start

0

在docker容器中,如果您仍在为systemd苦苦挣扎,我认为您可以update-rc.d。我尝试使用update-rd.c并成功。


0

我遇到了完全相同的错误,然后使用 sudo

sudo systemctl status ssh

1
您不需要sudo。似乎是巧合。你能重新测试吗?
赞纳

1
@Zannasaif@sr-server:~$ systemctl status ssh Failed to connect to bus: No such file or directory saif@sr-server:~$ sudo systemctl status ssh [sudo] password for saif: ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2018-01-19 23:38:14 PKT; 4min 4s ago Main PID: 18222 (sshd) Tasks: 15 Memory: 32.7M CPU: 488ms
Saif

为什么是-1?我刚刚发布了对我有用的东西。
赛义夫

downvote不是我的...
Zanna
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.