Di buruh pelabuhan, file yang dibuat di dalam container cenderung memiliki kepemilikan yang tidak dapat diprediksi saat memeriksanya dari host. Pemilik file pada volume adalah root (uid 0) secara default, tetapi segera setelah akun pengguna non-root terlibat dalam penampung dan menulis ke sistem file, pemilik menjadi kurang lebih acak dari perspektif host.
Ini adalah masalah ketika Anda perlu mengakses data volume dari host menggunakan akun pengguna yang sama yang memanggil perintah buruh pelabuhan.
Solusi umumnya adalah
- memaksa uID pengguna pada waktu pembuatan di Dockerfiles (non portabel)
- meneruskan UID pengguna host ke
docker run
perintah sebagai variabel lingkungan dan kemudian menjalankan beberapachown
perintah pada volume dalam skrip entrypoint.
Kedua solusi ini dapat memberikan kontrol atas izin aktual di luar penampung.
Saya berharap ruang nama pengguna menjadi solusi terakhir untuk masalah ini. Saya telah menjalankan beberapa pengujian dengan versi 1.10 yang baru dirilis dan --userns-remap disetel ke akun desktop saya. Namun, saya tidak yakin itu dapat membuat kepemilikan file pada volume yang terpasang lebih mudah ditangani, saya khawatir itu sebenarnya bisa sebaliknya.
Misalkan saya memulai wadah dasar ini
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
Dan kemudian periksa konten dari host:
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
Nomor '100000' ini adalah sub-UID pengguna host saya, tetapi karena tidak sesuai dengan UID pengguna saya, saya masih tidak dapat mengedit test.txt tanpa hak istimewa. Sub-pengguna ini tampaknya tidak memiliki ketertarikan dengan pengguna biasa saya yang sebenarnya di luar buruh pelabuhan. Ini tidak dipetakan kembali.
Solusi yang disebutkan sebelumnya dalam posting ini yang terdiri dari menyelaraskan UID antara host dan penampung tidak berfungsi lagi karena UID->sub-UID
pemetaan yang terjadi di namespace.
Lalu, apakah ada cara untuk menjalankan buruh pelabuhan dengan namespace pengguna diaktifkan (untuk keamanan yang lebih baik), sementara masih memungkinkan bagi pengguna host yang menjalankan buruh pelabuhan untuk memiliki file yang dihasilkan pada volume?
Jawaban:
Jika Anda dapat mengatur sebelumnya pengguna dan grup, maka dimungkinkan untuk menetapkan UID dan GID dengan cara yang spesifik sehingga pengguna host sesuai dengan pengguna dengan namespace di dalam container.
Berikut contohnya (Ubuntu 14.04, Docker 1.10):
Buat beberapa pengguna dengan ID numerik tetap:
Edit secara manual rentang ID bawahan yang dibuat secara otomatis dalam
/etc/subuid
dan/etc/subgid
file:(perhatikan tidak ada catatan untuk
ns1-root
danns1-user1
karenaMAX_UID
danMAX_GID
batas dalam/etc/login.defs
)Aktifkan ruang nama pengguna di
/etc/default/docker
:Mulai ulang daemon
service docker restart
, pastikan/var/lib/docker/500000.500000
direktori dibuat.Sekarang, di dalam container Anda memiliki
root
danuser1
, dan pada host -ns1-root
danns1-user1
, dengan ID yang cocokUPDATE: untuk menjamin bahwa pengguna non-root memiliki ID tetap dalam penampung (misalnya, pengguna1 1000: 1000), buatlah secara eksplisit selama pembuatan gambar.
Uji jalan:
Siapkan direktori volume
Cobalah dari wadah
Coba dari tuan rumah
Tidak portabel dan terlihat seperti retasan, tetapi berfungsi.
sumber
subUID lower bound + UID in image
jika kita menjalankan banyak gambar berbeda dengan pengguna yang memiliki ID disetel ke 1000?Salah satu solusinya adalah dengan menetapkan uid pengguna secara dinamis pada waktu pembuatan agar cocok dengan host.
Contoh
Dockerfile
:Kemudian buat sebagai:
dan dijalankan sebagai:
Jika Anda sudah memiliki penampung, buat penampung pembungkus dengan yang berikut ini
Dockerfile
:Ini bisa dibungkus
docker-compose.yml
seperti:Kemudian buat dan jalankan sebagai:
sumber
Anda dapat menghindari masalah izin dengan menggunakan
docker cp
perintah .Berikut adalah contoh Anda yang beralih untuk digunakan
docker cp
:Namun, jika Anda hanya ingin membaca file dari sebuah wadah, Anda tidak memerlukan nama volume. Contoh ini menggunakan wadah bernama, bukan volume bernama:
Saya menemukan volume bernama berguna ketika saya ingin menyalin file ke dalam wadah, seperti yang dijelaskan dalam pertanyaan ini .
sumber
docker cp
melibatkan duplikasi data. Selain itu, menurut dokumen tersebut, saat menyalin data ke penampung, ia menetapkan ID kepemilikan sesuai dengan pengguna root, yang seringkali bukan akun yang menjalankan aplikasi dalam container. Saya gagal untuk melihat bagaimana itu memecahkan masalah kita.docker cp
memberi Anda kendali penuh atas kepemilikan file ketika Anda mengalirkan arsip tar ke dalam atau keluar dari sebuah wadah. Anda dapat menyesuaikan kepemilikan dan izin setiap entri di file tar saat Anda streaming, jadi Anda tidak terbatas pada pengguna root.