Запуск systemd внутри контейнера docker (arch linux)

Я пытаюсь выяснить, могу ли я запустить systemd внутри контейнера docker (который запускает arch linux в контейнере).

Я запускаю docker со всеми возможностями и привязываю монтирование в cgroups:

docker run -it --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ..

однако, если я попытаюсь запустить двоичный файл systemd:

Trying to run as user instance, but the system has not been booted with systemd.

Попытка выяснить, как правильно инициализировать запуск systemd.

Вот мой мастер-файл : D запуск systemd внутри контейнера docker с ubuntu : DI Получил Ubuntu, работающий с systemd внутри docker

Репозиторий GitHub для моего контейнера docker-systemd

$ docker run -it --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro dockerimages/docker-systemd

Выход:

systemd 218 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN)Detected virtualization 'docker'.Detected architecture 'x86-64'.Welcome to Ubuntu Vivid Vervet (development branch)!Set hostname to <502ec40509a5>.[  OK  ] Created slice Root Slice.[  OK  ] Created slice System Slice.         Starting Emergency Shell...[  OK  ] Started Emergency Shell.Startup finished in 5ms.Welcome to emergency mode! After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D totry again to boot into default mode.root@502ec40509a5:~# exit

Обновление 2021 года

Множество исправлений было отправлено в разные проекты, такие как репозитории docker upstream от REDHAT.Чтобы было более ясно, мой друг Дэвид Уолш @ REDHAT также много писал об этом.https://developers.redhat.com/blog/author/rhatdan/.

Запуск SystemD Без дополнительных Привилегий требует

/run как tmpfs./sys/fs/cgroup только для чтения./sys/fs/cgroup/systemd чтение/запись./etc/machine-id Должен содержать уникальный идентификатор машиныSIGRTMIN+3 как stopsignal, так и sigterm не будут работать/var/log/journal Если он не существует, он будет записан в память

docker run -d \     --tmpfs /tmp \    --tmpfs /run \    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \    --stop-signal SIGRTMIN+3 \    httpd /sbin/init

Примечание: Флаг Stopsignal может быть удален, если ваш dockerfile содержит STOPSIGNAL SIGRTMIN+3

Смотрите полный текст поста. https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/

Примечание: Сегодня с Podman это было бы еще проще, читайте об этом здесь:https://developers.redhat.com/blog/2019/04/24/how-to-run-systemd-in-a-container/

Чтобы запустить systemd в контейнере Docker, хозяин система также должна запускать systemd. Это означает, что вы не можете использовать Ubuntu < 16.04 в качестве хоста.

В настоящее время systemd некорректно запускается в контейнере docker по целому ряду причин, т.е. из-за отсутствия правильных привилегий. Вы можете прочитать об этом в различных выпусках github по проекту docker, таких как запуск systemd внутри контейнера docker arch зависает или прерывается и связанные с этим вопросы, касающиеся мониторинга инициализации/процесса. (Я хотел бы связать здесь больше вопросов, но я не могу, так как у меня, по-видимому, недостаточно репутации).

Как вы можете видеть, над этой темой в настоящее время ведется работа, и уже было объединено несколько исправлений для улучшения поведения, так что мы можем ожидать, что это сработает довольно скоро.

По-видимому, некоторым разработчикам уже удалось запустить его в системах fedora, как они задокументировали в своем блоге.

По состоянию на 2018 год, это теперь работает для меня: docker run -it -e container=docker ваше-изображение-имя /sbin/init

Однако это не даст вам оболочки, поэтому вам нужно сначала включить какую-либо службу systemd (например, sshd) внутри образа, если это еще не было сделано, чтобы сделать что-нибудь полезное.

Нашел этот вопрос, пытаясь сделать это в официальном контейнере debian:8.Для тех, кто еще пытается сделать это в официальном контейнере debian: 8 (debian: jessie), ответ @Frank-from-DSPEED работает с небольшими изменениями, как описано в более старый пост git hub:

docker run -d \    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \    --cap-add SYS_ADMIN \    debian:jessie  /sbin/initdocker exec -it <your-new-container-name-or-ID> bash

Затем из контейнера:

systemctl show-environment

Это отлично работает для меня, и поскольку это всего лишь среда разработки, проблема безопасности для меня не имеет значения.

Примечание: Команда /sbin/init преобразует /sbin/init в процесс 1, что является ключевой частью выполнения этой работы.

Я смог работать в обратном направлении от этого: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 упрощает это, поскольку groups (ro) уже предоставляется в контейнерах - в настоящее время мне все еще нужен приватный доступ, чтобы он мог создавать монтирования PrivateTmp, но в остальном, пока вы указываете cmd для запуска как двоичный файл systemd - он работает хорошо.

Вы можете запустить systemd внутри контейнера docker. Операционная система хоста не имеет значения, хотя вам нужно будет смонтировать том /sys/fs/cgroup хоста. Я заставил его работать, следуя этому руководству: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

Не могли бы вы объяснить, зачем вам нужен systemd?

Справочная страница systemd была бы хорошим местом для начала. Google также выдает несколько статей о запуске systemd в docker.