Executando systemd dentro de um contêiner docker (Arch linux)

Estou tentando ver se consigo executar systemd dentro de um contêiner docker (que está executando o arch linux no contêiner).

Eu começo o docker com todos os recursos e vinculo a montagem em cgroups:

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

no entanto, se eu tentar executar o binário systemd:

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

Tentando descobrir como inserir as coisas corretamente para o systemd é iniciado.

Aqui meu mestre pice: d executando systemd dentro de um contêiner docker com ubuntu: di fez o Ubuntu funcionar com systemd dentro do docker

Repositório GitHub para meu contêiner docker-systemd

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

Saida:

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

Atualização 2021

Muitos Patches foram enviados para projetos diferentes, como os repositórios upstream do docker por REDHAT.To seja mais claro meu frind David Walsh @ REDHAT também postou muito sobre isso.https://developers.redhat.com/blog/author/rhatdan/.

Executar SystemD sem privilégios adicionais Requer

/run como um tmpfs./sys/fs/cgroup somente leitura./sys/fs/cgroup/systemd ler/escrever./etc/machine-id Precisa conter um Uniqe MachineIDSIGRTMIN+3 como stopsignal como sigterm não funcionará/var/log/journal Se não existir, ele gravará na memória

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

Nota: o sinalizador Stopsignal pode ser descartado quando seu dockerfile contém STOPSIGNAL SIGRTMIN+3

Veja o Post completo. https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/

Nota: hoje com Podman isso seria ainda mais simples ler sobre isso aqui:https://developers.redhat.com/blog/2019/04/24/how-to-run-systemd-in-a-container/

Para executar systemd em um contêiner Docker, o hospedar o sistema também deve executar systemd. Isso significa que você não pode usar o Ubuntu & lt; 16.04 como o host.

Atualmente systemd não é executado corretamente dentro de um contêiner docker, devido a todo um conjunto de razões, ou seja, a falta dos privilégios corretos. Você pode ler sobre isso em uma variedade de problemas do github no projeto docker, como executando systemd dentro do contêiner docker arch trava ou segfaults e questões relacionadas com o init / monitoramento de processos. (Eu gostaria de vincular mais problemas aqui, mas não posso, pois aparentemente Não tenho reputação suficiente).

Como você pode ver, este é um tópico que está sendo trabalhado no momento e alguns patches já foram mesclados para melhorar o comportamento, para que possamos esperar que isso funcione em breve.

Aparentemente, alguns desenvolvedores já conseguiram fazê-lo funcionar em sistemas fedora, como documentaram em seu blog.

A partir de 2018, isso agora funciona para mim: docker run -it -e container=docker your-image-name /sbin/init

Isso não lhe dará um shell, no entanto, então você precisará primeiro habilitar algum serviço systemd (por exemplo, sshd) dentro da imagem se isso ainda não tiver sido feito, para fazer qualquer coisa útil.

Encontrei esta pergunta ao tentar fazer isso no contêiner oficial debian:8.Para qualquer outra pessoa tentando fazer isso no contêiner oficial debian:8 (debian:jessie), a resposta de @Frank-from-DSPEED funciona com uma ligeira modificação conforme descrito em uma postagem mais antiga do 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

Em seguida, a partir do recipiente:

systemctl show-environment

Isso funciona perfeitamente para mim e, como esse é apenas um ambiente de desenvolvimento, o problema de segurança não importa para mim.

Nota: o comando / sbin / init obtém / sbin / init para ser o processo 1, que é uma parte fundamental para fazer este trabalho.

Eu era capaz de trabalhar para trás a partir deste: https://registry.hub.docker.com/u/codekoala/arch/

O Docker 1.1 torna isso mais fácil, pois groups (ro) já é fornecido em contêineres - ainda preciso de acesso priv para que ele possa criar montagens PrivateTmp, mas, caso contrário, contanto que você especifique o cmd para ser executado como o binário systemd - ele funciona bem.

Você pode executar systemd dentro de um contêiner docker. O sistema operacional host não importa, embora você precise montar o volume /sys/fs/cgroup do host. Eu tenho que trabalhar seguindo este guia: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

Você poderia explicar por que precisa do systemd?

A página de manual do` systemd ’ seria um bom lugar para começar. O Google também produz vários artigos sobre a execução do systemd no docker.