【发布时间】:2019-02-16 21:38:04
【问题描述】:
我正在尝试创建一个基于 systemd 的 docker 容器,但是当我尝试运行构建的容器时,我的系统崩溃了。我认为在容器中运行 init 可能会导致冲突,并且在某种程度上与我主机上的 systemd 冲突。
当我尝试运行 docker 容器时,我退出了我的帐户,并简要查看了我的系统在启动过程中的样子。我的主机正在运行 Arch Linux,带有 linux 4.20.7。
只有当我尝试通过/sbin/init 运行 systemd 来“启动”容器时,才会出现问题。
docker run -it \
--volume=/sys/fs/cgroup:/sys/fs/cgroup:rw \
--privileged 66304e3bc48
Dockerfile(改编自solita/ubuntu-systemd):
FROM ubuntu:18.04
# Don't start any optional 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 \{} \;
RUN apt-get update && \
apt-get install --yes \
python sudo bash ca-certificates dbus systemd && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN systemctl set-default multi-user.target
RUN systemctl mask dev-hugepages.mount sys-fs-fuse-connections.mount
STOPSIGNAL SIGRTMIN+3
# Workaround for docker/docker#27202, technique based on comments from docker/docker#9212
CMD ["/bin/bash", "-c", "exec /sbin/init --log-target=journal 3>&1"]
我希望容器只是启动运行 systemd,而我不是你可能做错的事。
【问题讨论】:
-
添加
--privileged赋予了容器进程这个权利,systemd 想要管理很多东西。您能否使用像 supervisord 这样的轻量级 init 进程来实现您的最终目标,或者更好的是,没有专用 init 的单进程容器? -
我更愿意这样做,问题是我将它用于配置管理测试,因此我希望容器与主机尽可能匹配。我最终需要测试使用
systemctl重新启动服务是否有效。 -
“尽可能匹配主机”:Docker 容器无法运行典型的完整主机系统运行的许多东西,包括系统守护进程、远程登录服务等。 如果“匹配主机”是您的目标,那么虚拟机将是更自然的匹配。
-
是的,不幸的是,这并不可行。我希望在只有 docker 容器可用的 CI 运行期间测试角色。
-
我在 Ubuntu 19.04 和 Docker nightly builds 中遇到了这个问题。 Ubuntu 18.04 以及当前的 docker 版本也有这个问题。主机系统未重新启动 - X11 似乎正在崩溃或被终止。