Dua opsi yang saya temukan:
MENGAKUKAN semua hal (setelah melakukan pekerjaan Anda)
Saya telah melakukan docker run -v `pwd`/shared:/shared image
, dan penampung telah membuat file di dalam pwd/shared
itulah yang dimiliki oleh proses buruh pelabuhan. Namun, /shared
masih dimiliki oleh saya. Jadi dalam proses buruh pelabuhan, saya melakukannya
chown -R `stat -c "%u:%g" /shared` /shared
stat -c "%u:%g" /shared
mengembalikan 1000:1000
dalam kasus saya, menjadi uid:gid
pengguna saya. Padahal tidak ada user 1000
di dalam docker conatainer, id ada di sana (dan stat /shared
cukup katakan "tidak dikenal" jika Anda meminta nama pengguna).
Pokoknya, chown
dengan patuh mengalihkan kepemilikan konten /shared
ke 1000:1000
(yang sejauh ini tidak ada, tapi di luar wadah, ini saya). Jadi saya sekarang memiliki semua file. Kontainer masih dapat memodifikasi sesuatu jika diinginkan, karena dari sudut pandangnya, ini adalah root
.
Dan semuanya baik-baik saja dengan dunia.
docker run -u
jadi semua file yang dibuat otomatis akan memiliki pemilik yang tepat
Cara lain untuk melakukannya adalah -u
bendera pada docker run.
docker run -v `pwd`/shared:/shared -u `stat -c "%u:%g" /shared` ubuntu bash
Dengan cara ini, pengguna buruh pelabuhan di dalam wadah adalah youruid:yourgid
.
Namun: ini berarti melepaskan otoritas root Anda di dalam penampung (apt-get install
, dll.). Kecuali jika Anda membuat pengguna dengan uid baru itu dan menambahkannya ke root
grup.
Apakah itu benar? Dapatkah seseorang mengarahkan saya ke dokumentasi ini, saya hanya berspekulasi berdasarkan eksperimen di atas.
Mungkin ini hanya karena keduanya memiliki nilai numerik yang sama pada kernel, dan jika saya menguji pada sistem di mana pengguna rumahan saya bukan id 1000, maka izin akan berubah dalam setiap kasus?
Baca info coreutils 'chown invocation'
, yang mungkin memberi Anda gambaran yang lebih baik tentang cara kerja izin / kepemilikan file.
Namun, pada dasarnya, setiap file di mesin Anda memiliki sekumpulan bit yang ditempelkan padanya yang menentukan izin dan kepemilikannya. Saat Anda chown
file, Anda hanya menyetel bit-bit ini.
Saat Anda chown
file ke pengguna/grup tertentu dengan menggunakan nama pengguna atau nama grup, chown
akan mencari di /etc/passwd
untuk nama pengguna dan /etc/group
untuk grup untuk mencoba memetakan nama ke ID. Jika nama pengguna/nama grup tidak ada di file tersebut, chown
akan gagal.
[email protected]:/test# touch test
[email protected]:/test# ll
total 8
drwxr-xr-x 2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r-- 1 root root 0 Oct 22 18:15 test
[email protected]:/test# chown test:test test
chown: invalid user: 'test:test'
Namun, Anda dapat chown
file menggunakan ID untuk apa pun yang Anda inginkan (dalam beberapa batas bilangan bulat positif atas, tentu saja), apakah ada pengguna/grup yang ada dengan ID tersebut di mesin Anda atau tidak.
[email protected]:/test# chown 5000:5000 test
[email protected]:/test# ll
total 8
drwxr-xr-x 2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r-- 1 5000 5000 0 Oct 22 18:15 test
Bit UID dan GID disetel pada file itu sendiri, jadi saat Anda memasang file tersebut di dalam wadah buruh pelabuhan, file tersebut memiliki UID pemilik/grup yang sama seperti pada host, tetapi sekarang dipetakan ke /etc/passwd
dalam penampung, yang mungkin akan menjadi pengguna lain kecuali jika dimiliki oleh root (UID 0).
Pertanyaan sebenarnya adalah, tentu saja, 'apa yang harus saya lakukan?' Jika bob masuk sebagai bob pada mesin host yang diberikan, dia harus dapat menjalankan wadah sebagai bob dan tidak mengubah izin file di bawah akun host-nya. Seperti berdiri, dia benar-benar perlu menjalankan penampung sebagai buruh pelabuhan pengguna untuk menghindari perubahan akunnya.
Sepertinya, dengan penyiapan Anda saat ini, Anda harus memastikan UID> nama pengguna Anda di /etc/passwd
di host Anda cocok dengan UID Anda> nama pengguna di wadah Anda /etc/passwd
jika Anda ingin berinteraksi dengan direktori pengguna yang terpasang sebagai pengguna yang sama yang masuk ke host.
Anda dapat membuat pengguna dengan id pengguna tertentu dengan useradd -u xxxx
. Buuuut, sepertinya itu solusi yang berantakan...
Anda mungkin harus menemukan solusi yang tidak memasang direktori home pengguna host.
Jadi, saya berakhir di pos ini mencari cara memulihkan kepemilikan semua file (dimiliki oleh root) yang keluar dari wadah buruh pelabuhan yang berjalan sebagai root , kepada pengguna saya yang tidak memiliki hak istimewa di host.
Saya membutuhkan proses di dalam container untuk dijalankan sebagai root, jadi saya tidak bisa menggunakan -u saat docker dijalankan.
Saya tidak bangga dengan apa yang saya lakukan, tetapi di akhir skrip bash saya, saya menambahkan ini:
docker run --rm -it \
--entrypoint /bin/sh \
-e HOST_UID=`id -u` \
-v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp \
alpine:latest \
-c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'
Mari kita uraikan beberapa baris:
- Jalankan /bin/sh di dalam wadah:
--entrypoint /bin/sh
- Teruskan uid pengguna saat ini sebagai variabel lingkungan ke penampung:
-e HOST_UID=`id -u`
- Pasang folder apa pun yang ingin Anda miliki kembali ke pengguna Anda (diisi dengan file yang dimiliki oleh root, dihasilkan oleh wadah sebelumnya yang dijalankan sebagai root ), di bawah
/tmp
penampung baru ini :
-v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp
- Jalankan
chown
secara rekursif dengan uid pengguna host di atas direktori target (dipasang di dalam wadah di/tmp
):
-c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'
Jadi, dengan ini, saya mendapatkan file yang dimiliki kembali ke pengguna saya saat ini tanpa harus "meningkatkan" hak istimewa ke root atau ke sudo.
Itu kotor, tapi berhasil. Semoga saya membantu.