Menjalankan systemd di dalam wadah docker (arch linux)

Saya mencoba untuk melihat apakah saya dapat menjalankan systemd di dalam wadah docker (yang menjalankan arch linux dalam wadah).

Saya memulai docker dengan semua kemampuan, dan mengikat mount di cgroups:

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

namun, jika saya mencoba menjalankan biner systemd:

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

Mencoba mencari tahu cara memasukkan hal-hal dengan benar ke systemd dimulai.

Di sini master saya pice: d menjalankan systemd di dalam wadah docker dengan ubuntu: Di Membuat Ubuntu bekerja dengan systemd di dalam docker

GitHub Repo untuk wadah docker-systemd saya

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

Keluaran:

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

Pembaruan 2021

Banyak tambalan dikirim ke proyek yang berbeda seperti repo upstream buruh pelabuhan oleh REDHAT.To lebih jelas frind David Walsh @ REDHAT saya juga memposting banyak tentang itu.https://developers.redhat.com/blog/author/rhatdan/.

Menjalankan SystemD tanpa hak tambahan membutuhkan

/run sebagai tmpfs./sys/fs/cgroup baca / saja./sys/fs/cgroup/systemd membaca / menulis./etc/machine-id Perlu mengandung Mesin UniqeSIGRTMIN+3 sebagai stopsignal sebagai sigterm tidak akan berfungsi/var/log/journal Jika tidak ada itu akan menulis ke memori

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

Catatan: Flag Stopsignal dapat dihapus saat dockerfile Anda berisi STOPSIGNAL SIGRTMIN+3

Lihat posting lengkap. https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/

Catatan: hari ini dengan Podman ini akan lebih mudah dibaca di sini:https://developers.redhat.com/blog/2019/04/24/how-to-run-systemd-in-a-container/

Untuk menjalankan systemd dalam wadah Docker, file host sistem juga harus menjalankan systemd. Ini berarti Anda tidak dapat menggunakan Ubuntu < 16.04 sebagai host.

Saat ini systemd tidak berjalan dengan benar dalam wadah buruh pelabuhan, karena serangkaian alasan, yaitu kurangnya hak istimewa yang benar. Anda dapat membacanya di berbagai masalah github di proyek docker seperti menjalankan systemd di dalam Docker arch container hang atau segfault dan isu-isu terkait mengenai init / proses pemantauan. (Saya ingin menautkan lebih banyak masalah di sini, tetapi saya tidak bisa karena saya tampaknya tidak memiliki reputasi yang cukup).

Seperti yang Anda lihat, ini adalah topik yang saat ini sedang dikerjakan dan beberapa tambalan telah digabungkan untuk meningkatkan perilaku, sehingga kami dapat mengharapkan ini berfungsi segera.

Rupanya beberapa pengembang sudah berhasil membuatnya berjalan di sistem fedora, seperti yang telah mereka dokumentasikan dalam blog mereka.

Pada 2018, ini sekarang bekerja untuk saya: docker run -it -e container=docker nama-gambar-Anda /sbin/init

Ini tidak akan memberi Anda shell, jadi Anda harus terlebih dahulu mengaktifkan beberapa layanan systemd (misalnya sshd) di dalam gambar jika itu belum dilakukan, untuk melakukan sesuatu yang berguna.

Menemukan pertanyaan ini saat mencoba melakukan ini di wadah resmi debian: 8.Bagi orang lain yang mencoba melakukan ini di wadah resmi debian:8 (debian: jessie), jawaban @ Frank-from-DSPEED berfungsi dengan sedikit modifikasi seperti yang dijelaskan di git hub post yang lebih lama:

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

Kemudian dari dalam wadah:

systemctl show-environment

Ini bekerja dengan sempurna untuk saya dan karena ini hanya lingkungan pengembangan, masalah keamanan tidak menjadi masalah bagi saya.

Catatan: perintah/sbin / init mendapat / sbin / init menjadi proses 1, yang merupakan bagian penting dari pembuatan karya ini.

Saya bisa bekerja mundur dari ini: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 Mempermudah ini karena groups (ro) sudah disediakan dalam wadah - saat ini saya masih memerlukan akses priv sehingga dapat membuat tunggangan PrivateTmp, tetapi sebaliknya, selama Anda menentukan cmd untuk dijalankan sebagai biner systemd - ini berfungsi dengan baik.

Anda dapat menjalankan systemd di dalam wadah docker. OS host tidak masalah, meskipun Anda harus memasang volume host /sys/fs/cgroup. Saya mendapatkannya untuk bekerja mengikuti panduan ini: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

Bisakah anda menjelaskan mengapa Anda membutuhkan systemd?

Halaman manual ‘systemd’ akan menjadi tempat yang baik untuk memulai. Google juga menghasilkan beberapa artikel tentang menjalankan systemd di bawah docker.