在docker容器中运行systemd会导致主机崩溃

问题描述 投票:2回答:2

我正在尝试创建一个基于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 systemd
2个回答
1
投票

“尽可能接近主机”是docker-systemctl-replacement脚本的最初目标。您可以在稍后可能在虚拟机上运行的容器中测试驱动器脚本。它允许在没有活动的systemd守护进程的情况下执行一些systemctl命令。

如果您愿意,它还可以充当init守护进程。启用systemd的操作系统在容器内部会感觉非常相似。


1
投票

我最终使用了paulfantom/ubuntu-molecule Docker镜像。

目前看起来他们只是安装systemd,设置一些环境变量,并直接使用systemd二进制文件作为入口点。它似乎没有我在原帖中提到的问题。

Dockerfile

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"]
© www.soinside.com 2019 - 2024. All rights reserved.