我正在尝试在 Docker 容器systemctl
中使用该命令ubuntu:16.04
。我正在运行以下命令...
systemctl status ssh
但是我收到了错误...
Failed to connect to bus: No such file or directory
为什么这不起作用?这与在 Docker 容器中运行的 Ubuntu 有关吗?我怎样才能systemctl
正常工作?
答案1
我假设你用类似下面的命令启动你的docker容器
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 博客。