我试图在docker容器中安装和配置openstack(devstack)。安装时遇到以下错误
"无法获得D-Bus连接:没有与服务管理器的连接。"
后来,我查了一下,发现它因为systemd问题。当我尝试执行命令systemd
时$>systemd
我得到以下输出。
尝试作为用户实例运行,但系统尚未使用systemd启动。
以下是使用的东西。
主机操作系统:Ubuntu 14.04, Docker版本:Docker版本1.12.4,build 1564f02, Docker Container OS:Ubuntu 14.04
任何人都可以提供帮助。提前谢谢。
答案 0 :(得分:2)
首先,systemd
期望安装/sys/fs/cgroup
。此外,您必须使容器具有特权,否则会发生这种情况:
docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -it --rm ubuntu
然后你可以继续从bash运行/bin/systemd --system --unit=basic.target
,它应该正常运行(当然有一些错误,因为Docker没有虚拟化整个系统,library:ubuntu
图像也不是正常运行所需的最小尺寸):
在systemd
正常运行(半)之后,您只需使用docker stop
来停止容器。
这篇帖子是基于我自己的研究,也是几周的研究,对于我想打电话initbuntu
的项目(最初我试图让init
运行,但正在运行{{1}在我所有失败的尝试之后,直接是我唯一的解决方案)。该容器将在Docker Hub上以systemd
, Soon™ 的形式提供。现在,在发布时可以获得一份破损的副本(或者没有破坏,我不知道)。
来源(有点):
logandark/initbuntu
:StackOverflow帖子我丢失了链接。答案 1 :(得分:2)
首先,您可以在Docker here上使用DevStack Ocata / Pike获取预配置的Dockerfile。存储库还包含有关DevStack和容器的更多信息。
在Docker中运行systemd当然是可行的,并且已经完成before。我发现Ubuntu 16.04 LTS是Docker主机以及基本映像的良好基础。
您的systemd / DevStack Dockerfile
需要此配置,它还会清除Docker容器中您可能不想要的服务:
FROM ubuntu:16.04
#####################################################################
# Systemd workaround from solita/ubuntu-systemd and moby/moby#28614 #
#####################################################################
ENV container docker
# No need for graphical.target
RUN systemctl set-default multi-user.target
# Gracefully stop systemd
STOPSIGNAL SIGRTMIN+3
# Cleanup unneeded services
RUN find /etc/systemd/system \
/lib/systemd/system \
-path '*.wants/*' \
-not -name '*journald*' \
-not -name '*systemd-tmpfiles*' \
-not -name '*systemd-user-sessions*' \
-exec rm \{} \;
# Workaround for console output error moby/moby#27202, based on moby/moby#9212
CMD ["/bin/bash", "-c", "exec /sbin/init --log-target=journal 3>&1"]
如果您打算在所述容器中运行OpenStack / DevStack,那么启动它可以省去很多麻烦,而不是定义单独的安全功能和卷:
docker run \
--name devstack \
--privileged \
--detach \
image
要在新的systemd容器中获取bash,请尝试:
docker exec \
--tty \
--interactive \
devstack \
bash
答案 2 :(得分:1)
Systemd应该在正确配置的容器内工作。您可以以特权心情运行容器来运行systemd。
" Systemd无法在没有SYS_ADMIN的情况下运行,权限少于未胜任的权限(参见#2296(评论))。是的,它可以使它变得更容易" (一种自动设置这些的工具),但它仍然需要某些特权"
请参阅此Github issue
毕竟docker是一个应用程序容器并且它运行您在运行时指定的进程,在完成该进程后它将退出。可能是您需要一个OS容器或虚拟机来处理您的用例。请参阅操作系统容器与应用程序容器here
答案 3 :(得分:0)
在大多数情况下,错误消息会出现,因为安装程序已尝试运行" systemctl start"。与initscripts不同,systemctl命令不会尝试直接执行启动脚本 - 而是尝试联系systemd守护程序以执行服务的启动序列。因此,所有服务在systemd守护程序中都有一个共同的父级。
在docker容器中运行systemd守护进程只是为了启动服务可能会过分夸大。您可以使用systemctl-docker-replacement覆盖/ usr / bin / systemctl,在这种情况下,目标服务在没有systemd守护程序的帮助下启动。它直接从* .service文件运行ExecStart。