我正在尝试创建一个基于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,我不是你可能做错了什么。
“尽可能接近主机”是docker-systemctl-replacement脚本的最初目标。您可以在稍后可能在虚拟机上运行的容器中测试驱动器脚本。它允许在没有活动的systemd守护进程的情况下执行一些systemctl命令。
如果您愿意,它还可以充当init守护进程。启用systemd的操作系统在容器内部会感觉非常相似。
我最终使用了paulfantom/ubuntu-molecule Docker镜像。
目前看起来他们只是安装systemd,设置一些环境变量,并直接使用systemd二进制文件作为入口点。它似乎没有我在原帖中提到的问题。
FROM ubuntu:18.04
ENV container docker
ENV LC_ALL C
ENV DEBIAN_FRONTEND noninteractive
RUN sed -i 's/# deb/deb/g' /etc/apt/sources.list
# hadolint ignore=DL3008
RUN apt-get update \
&& apt-get install -y --no-install-recommends systemd python sudo bash iproute2 net-tools \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# hadolint ignore=SC2010,SC2086
RUN cd /lib/systemd/system/sysinit.target.wants/ \
&& ls | grep -v systemd-tmpfiles-setup | xargs rm -f $1
RUN rm -f /lib/systemd/system/multi-user.target.wants/* \
/etc/systemd/system/*.wants/* \
/lib/systemd/system/local-fs.target.wants/* \
/lib/systemd/system/sockets.target.wants/*udev* \
/lib/systemd/system/sockets.target.wants/*initctl* \
/lib/systemd/system/basic.target.wants/* \
/lib/systemd/system/anaconda.target.wants/* \
/lib/systemd/system/plymouth* \
/lib/systemd/system/systemd-update-utmp*
RUN systemctl set-default multi-user.target
ENV init /lib/systemd/systemd
VOLUME [ "/sys/fs/cgroup" ]
ENTRYPOINT ["/lib/systemd/systemd"]