Cara mengatur kemampuan Linux pada permintaan layanan Mode swarm docker

Saya sedang melihat gagasan vault berjalan di bawah swarm (1.12.x).

Satu wadah akan dimulai dengan:docker run -d --cap-add IPC_LOCK -p 8200:8200 -p 8215:8125 --name vault --volume /vagrant/vault:/vagrant/vault vault server -config=/path/to/vault.hcl

tetapi ketika saya ingin menjalankan ini di swarm sebagai layanan, tampaknya tidak ada cara untuk menentukan IPC_LOCK kemampuan, untuk mengunci pertukaran terenkripsi untuk layanan vault dalam kasus ini.

Bagaimana Saya bisa mengatur Flag -- cap-add saat memulai layanan Mode swarm dengan docker service create perintah?

Pada 20.10, ini tersedia dari docker service create dengan --cap-add:

$ docker service create --help...      --cap-add list                       Add Linux capabilities      --cap-drop list                      Drop Linux capabilities

Atau dalam file compose yang digunakan dengan docker stack deploy dengan sintaks yang sama dari file Versi 2:

version: "3.9"services:  app:    image: your-image:tag    cap_add:    - CAP_NAME1    - CAP_NAME2    cap_drop:    - CAP_NAME3    - CAP_NAME4

[Jawaban asli dari sebelum 20.10 ]

Saat ini tidak didukung, tetapi Docker sedang mengerjakan solusi. Logika di balik tidak termasuk --cap-add opsi secara membabi buta ada di cluster besar, mungkin ada masalah keamanan manajer yang mengirimkan kontainer dengan hak istimewa tambahan ke pekerja. Pekerja mungkin percaya menjalankan wadah aman yang tidak dapat mengakses host, tetapi tidak ingin mengizinkan akses root jarak jauh ke host melalui wadah istimewa.

Diskusi tentang ini berakhir di github di:

https://github.com/docker/docker/pull/26849#issuecomment-252704844

https://github.com/docker/swarmkit/issues/1030

https://github.com/docker/swarmkit/pull/1722

https://github.com/moby/moby/issues/25885#issuecomment-557790402 dan https://github.com/docker/cli/pull/2199

Semua jawaban lain di sini sudah tua. Docker 20.10.0 dan yang lebih baru sekarang mendukung kemampuan menentukan untuk layanan Swarm melalui docker service baris perintah dan Docker Stack YAML file format.

Pada baris perintah, Anda hanya menentukan --cap-add [capability] atau --cap-drop [capability].

Dan berikut adalah contoh untuk menambahkan kemampuan dalam file YAML tumpukan Docker:

version: "3.9"services:  your-service:    cap_add:      - CAP_SYS_ADMIN

Saya menemukan solusi untuk memecahkan masalah dan saya dapat menggunakan cap_net_admin dalam mode swarm.

Anda dapat memodifikasi kode sumber runtime untuk menambahkan kemampuan yang Anda butuhkan (ini akan menjadi pengaturan default lokal).

Misalnya saya menambahkan CAP_NET_ADMIN untuk runtime saya (digunakan nvidia-container-runtime)wanyvic / nvidia-container-runtime.

Setelah itu saya membangunnya kembali, memulai wadah (gunakan mode swarm), input: capsh --print dan CAP_NET_ADMIN dapat ditemukan:

root@25303a54ebb3:/# capsh --printCurrent:=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eipBounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcapSecurebits: 00/0x0/1'b0 secure-noroot: no (unlocked) secure-no-suid-fixup: no (unlocked) secure-keep-caps: no (unlocked)uid=0(root)gid=0(root)groups=

Tetapi metode ini tidak baik.

Saya juga tidak bisa mengatur cap_add atau cap_drop di docker-compose.yml, tapi saya tidak dapat menemukan cara untuk menyelesaikannya.

Lihat https://hub.docker.com/r/ixdotai/swarm-launcher

Repo itu didasarkan pada komentar / ide ini: https://github.com/moby/moby/issues/25885#issuecomment-573355530

Bergantung pada kasus penggunaan, solusinya adalah mengikat-mount /var/run/docker.sock dari host swarm ke layanan, lalu jalankan docker run --privileged ... atau docker run --cap-add ... dari layanan untuk mengeksekusi perintah istimewa Anda yang sebenarnya. (Anda harus menginstal docker cli pada gambar untuk layanan ini.) Wadah terdalam yang anda jalankan docker dengan cara ini akan memiliki hak istimewa/kemampuan host swarm daripada layanan, dan layanan hanya menjadi lapisan wadah tipis.