Запуск systemd в контейнере Docker вызывает сбой хоста - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь создать докер-контейнер на основе systemd, но при попытке запустить встроенный контейнер происходит сбой системы.Я думаю, что запуск init в контейнере может вызывать конфликт и каким-то образом конфликтует с systemd на моем хосте.

Когда я пытаюсь запустить докер-контейнер, я выхожу из своей учетной записи и кратко вижу, как это выглядитмоя система проходит процесс загрузки.Мой хост работает под управлением Arch Linux с linux 4.20.7.

Только когда я пытаюсь "загрузить" контейнер, запустив systemd через /sbin/init, возникает проблема.

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, и я не вашчто я могу делать не так.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Я закончил тем, что использовал paulfantom / ubuntu-молекулы Образ 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"]
0 голосов
/ 17 февраля 2019

Первоначальной целью сценария docker-systemctl-replace была первоначальная цель «сопоставить хост как можно ближе».Вы можете протестировать скрипты диска в контейнере, который позже может быть запущен на виртуальной машине.Это позволяет выполнять некоторые команды systemctl без активного демона systemd.

Он также может служить демоном инициации, если хотите.Операционная система с поддержкой systemd будет чувствовать себя очень похоже на контейнер внутри нее.

...