Pertimbangkan wadah Docker berikut:
docker run --rm -it -v /tmp:/mnt/tmp alpine sh
Ini memasang direktori host / tmp ke / mnt / tmp di dalam wadah alpine.
Sekarang, pada Sistem Host saya memasang volume NFS ke direktori / tmp:
mkdir /tmp/nfs
mount -t nfs4 192.168.1.100:/data /tmp/nfs
Mount berfungsi pada Sistem Host, dan saya melihat yang berikut:
# ls /tmp/nfs
file1 file2 file3
#
Tetapi di Docker Container, saya melihat direktori kosong:
# ls /mnt/tmp/nfs
#
Saya tahu bahwa saya dapat mengatasi ini dengan melakukan mount langsung di Docker Container. Tetapi saya benar-benar tertarik untuk mengetahui mengapa mount bekerja pada container host tetapi tidak pada container docker?
Jawaban:
Ini terjadi karena volumenya menggunakan
private
mount propagation. Ini berarti bahwa begitu mount terjadi, setiap perubahan yang terjadi di sisi asal (mis. Sisi "host" dalam kasus Docker) tidak akan terlihat di bawah mount.Ada beberapa cara untuk menangani ini:
Lakukan pemasangan NFS terlebih dahulu, kemudian mulai wadah. Mount akan merambat ke wadah, namun seperti sebelum perubahan apa pun pada mount tidak akan terlihat oleh kontainer (termasuk unmount).
Gunakan propagasi "budak". Ini berarti bahwa setelah mount dibuat, setiap perubahan di sisi asal (buruh pelabuhan) akan dapat dilihat di target (dalam wadah). Jika Anda sedang melakukan mount bersarang, Anda akan ingin menggunakan
rslave
(r
untuk rekursif).Ada juga propagasi "bersama". Mode ini akan membuat perubahan ke titik mount dari dalam wadah merambat ke host, serta sebaliknya. Karena pengguna Anda bahkan tidak memiliki hak istimewa untuk melakukan perubahan seperti itu (kecuali jika Anda menambahkan CAP_SYS_ADMIN), ini mungkin bukan yang Anda inginkan.
Anda dapat mengatur mode propagasi saat membuat mount seperti:
Alternatif lain adalah menggunakan volume daripada mount host. Anda dapat melakukan ini seperti ini:
Ini akan memastikan untuk selalu me-mount dalam wadah untuk Anda, tidak bergantung pada pengaturan host dalam beberapa cara tertentu atau berurusan dengan propagasi mount.
Catatan :
:
di bagian depan lintasan perangkat diperlukan, hanya sesuatu yang aneh tentang modul kernel nfs.Catatan : Docker saat ini tidak menyelesaikan
<nfs host>
dari nama DNS (itu akan di 1.13) sehingga Anda harus memberikan alamat ip di sini.Rincian lebih lanjut tentang pemasangan "subtree bersama": https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt
sumber
Aktifkan propagasi pemasangan bersama pada volume dengan menambahkan: shared flag di akhir argumen volume:
Jika Docker diinstal melalui manajer paket atau menginstal skrip untuk systemd, Anda mungkin perlu menyesuaikan argumen daemon MountFlags. Untuk melakukannya, cari file docker.service:
Dalam kasus saya di Ubuntu 16.04, ia berada di /etc/systemd/system/multi-user.target.wants/docker.service. Edit file ini dengan vi atau nano, dan pastikan bahwa opsi MountFlags berbunyi:
Simpan file, muat ulang daemon args, dan mulai ulang buruh pelabuhan:
Sekarang Anda harus dapat mengatur bendera propagasi mount bersama pada volume saat menggunakan "docker run".
sumber
Mulai dari buruh pelabuhan 17,06, Anda dapat memasang saham NFS ke wadah secara langsung saat Anda menjalankannya, tanpa perlu kemampuan tambahan
Atau, Anda dapat membuat volume sebelum wadah:
Dapatkan petunjuk dari https://github.com/moby/moby/issues/28809
sumber