Singkatnya: Saya mencoba memasang direktori host di Docker, tetapi kemudian saya tidak dapat mengaksesnya dari dalam wadah, bahkan jika izin aksesnya terlihat bagus.
Rinciannya:
saya lakukan
sudo docker run -i -v /data1/Downloads:/Downloads ubuntu bash
lalu
ls -al
Ini memberi saya:
total 8892
drwxr-xr-x. 23 root root 4096 Jun 18 14:34 .
drwxr-xr-x. 23 root root 4096 Jun 18 14:34 ..
-rwxr-xr-x. 1 root root 0 Jun 18 14:34 .dockerenv
-rwx------. 1 root root 9014486 Jun 17 22:09 .dockerinit
drwxrwxr-x. 18 1000 1000 12288 Jun 16 11:40 Downloads
drwxr-xr-x. 2 root root 4096 Jan 29 18:10 bin
drwxr-xr-x. 2 root root 4096 Apr 19 2012 boot
drwxr-xr-x. 4 root root 340 Jun 18 14:34 dev
drwxr-xr-x. 56 root root 4096 Jun 18 14:34 etc
drwxr-xr-x. 2 root root 4096 Apr 19 2012 home
dan lebih banyak baris seperti itu (saya pikir ini adalah bagian yang relevan).
Jika aku melakukan
cd /Downloads
ls
hasilnya adalah
ls: cannot open directory .: Permission denied
Tuan rumah adalah Fedora 20, dengan Docker 1.0.0 dan go1.2.2.
Apa yang salah?
sumber
-v $(pwd):/app:ro,Z
. Ini harus ditandai sebagai jawaban yang benar.Ini adalah masalah SELinux .
Anda dapat mengeluarkan sementara
pada host untuk mengakses atau menambahkan aturan SELinux dengan menjalankan
sumber
PERINGATAN: Solusi ini memiliki risiko keamanan.
Coba jalankan wadah sebagai hak istimewa:
Pilihan lain (yang belum saya coba) adalah membuat wadah istimewa dan kemudian membuat wadah non-istimewa di dalamnya.
sumber
--privileged=true
--privileged
adalah risiko keamananBiasanya, masalah izin dengan pemasangan volume host adalah karena uid / gid di dalam wadah tidak memiliki akses ke file sesuai dengan izin uid / gid dari file pada host. Namun, kasus spesifik ini berbeda.
Titik di akhir string izin
drwxr-xr-x.
,, menunjukkan SELinux dikonfigurasi. Saat menggunakan host host dengan SELinux, Anda harus memberikan opsi tambahan ke akhir definisi volume:Perintah volume mount Anda akan terlihat seperti:
Lihat lebih lanjut tentang host host dengan SELinux di: https://docs.docker.com/storage/#configure-the-selinux-label
Untuk orang lain yang melihat masalah ini dengan wadah berjalan sebagai pengguna yang berbeda, Anda perlu memastikan uid / gid dari pengguna di dalam wadah memiliki izin ke file di host. Pada server produksi, ini sering dilakukan dengan mengendalikan uid / gid dalam proses pembuatan gambar agar sesuai dengan uid / gid pada host yang memiliki akses ke file (atau bahkan lebih baik, jangan menggunakan host host dalam produksi).
Volume bernama sering dipilih untuk meng-host mount karena akan menginisialisasi direktori volume dari direktori gambar, termasuk kepemilikan dan izin file apa pun. Ini terjadi ketika volume kosong dan wadah dibuat dengan volume bernama.
Pengguna MacOS sekarang memiliki OSXFS yang menangani uid / gid secara otomatis antara host Mac dan wadah. Satu tempat yang tidak membantu adalah file dari dalam VM tertanam yang bisa dipasang ke dalam wadah, seperti /var/lib/docker.sock.
Untuk lingkungan pengembangan tempat host uid / gid dapat berubah per pengembang, solusi pilihan saya adalah memulai wadah dengan entrypoint berjalan sebagai root, perbaiki uid / gid pengguna di dalam wadah agar sesuai dengan volume host uid / gid, dan lalu gunakan
gosu
untuk menjatuhkan dari root ke pengguna wadah untuk menjalankan aplikasi di dalam wadah. Skrip penting untuk ini adafix-perms
di skrip gambar dasar saya, yang dapat ditemukan di: https://github.com/sudo-bmitch/docker-baseBit penting dari
fix-perms
skrip adalah:Itu mendapatkan uid dari pengguna di dalam wadah, dan uid dari file, dan jika mereka tidak cocok, panggilan
usermod
untuk menyesuaikan uid. Terakhir ia melakukan pencarian rekursif untuk memperbaiki file yang belum berubah. Saya suka ini lebih baik daripada menjalankan wadah dengan-u $(id -u):$(id -g)
bendera karena kode entri di atas tidak mengharuskan setiap pengembang untuk menjalankan skrip untuk memulai wadah, dan file apa pun di luar volume yang dimiliki oleh pengguna akan memiliki izin mereka diperbaiki.Anda juga dapat membuat buruh pelabuhan menginisialisasi direktori host dari sebuah gambar dengan menggunakan volume bernama yang melakukan mount mengikat. Direktori ini harus ada sebelumnya, dan Anda harus memberikan path absolut ke direktori host, tidak seperti volume host dalam file penulisan yang bisa menjadi path relatif. Direktori juga harus kosong untuk buruh pelabuhan untuk menginisialisasi. Tiga opsi berbeda untuk mendefinisikan volume bernama ke bind mount terlihat seperti:
Terakhir, jika Anda mencoba menggunakan ruang nama pengguna, Anda akan menemukan bahwa volume host memiliki masalah izin karena uid / gid dari wadah tersebut digeser. Dalam skenario itu, mungkin paling mudah untuk menghindari volume host dan hanya menggunakan volume bernama.
sumber
Dari access.redhat.com:Sharing_Data_Across_Containers :
Tampaknya hanya solusi, tetapi saya mencoba dan berhasil.
sumber
Saya memverifikasi bahwa
chcon -Rt svirt_sandbox_file_t /path/to/volume
itu berfungsi dan Anda tidak harus menjalankan sebagai wadah istimewa.Ini aktif:
sumber
Coba
docker volume create
.Lihatlah dokumen https://docs.docker.com/engine/reference/commandline/volume_create/
sumber
Saya memiliki masalah yang sama, masalah saya disebabkan oleh ketidakcocokan antara UID host dan UID pengguna kontainer. Cara mengatasinya adalah untuk lulus UID pengguna sebagai argumen untuk membangun buruh pelabuhan dan membuat pengguna wadah dengan UID yang sama.
Di DockerFile:
Pada langkah build:
Setelah itu, menjalankan wadah dan perintah sesuai OP memberi saya hasil yang diharapkan.
sumber
Saya menyelesaikan masalah itu dengan menggunakan wadah data, ini juga memiliki keuntungan untuk mengisolasi data dari lapisan aplikasi. Anda bisa menjalankannya seperti ini:
Tutorial ini memberikan penjelasan yang baik tentang penggunaan wadah data.
sumber
Dalam situasi saya masalahnya berbeda. Saya tidak tahu mengapa, tetapi bahkan jika direktori pada host punya
chmod 777
berjalan di dalamnya, di dalam buruh pelabuhan itu terlihat755
.Menjalankan di dalam wadah
sudo chmod 777 my_volume_dir
memperbaikinya.sumber
chmod 777
hampir tidak pernah memperbaiki apa pun.sudo -s
melakukan trik untuk saya di MACsumber