Misalkan saya memiliki wadah Docker dan folder di host saya /hostFolder
. Sekarang jika saya ingin menambahkan folder ini ke wadah Docker sebagai volume, maka saya bisa melakukan ini dengan menggunakan ADD
di Dockerfile
atau memasangnya sebagai volume.
Sejauh ini baik.
Sekarang /hostFolder
berisi sub-folder /hostFolder/subFolder
,.
Saya ingin me-mount /hostFolder
ke dalam wadah Docker (apakah sebagai read-write atau read-only tidak masalah, bekerja baik untuk saya), tapi saya tidak ingin memilikinya termasuk /hostFolder/subFolder
. Saya ingin mengecualikan ini, dan saya juga ingin wadah Docker dapat membuat perubahan pada sub-folder ini, tanpa konsekuensi mengubahnya di host juga.
Apakah ini mungkin? Jika ya, bagaimana caranya?
docker
dockerfile
Golo Roden
sumber
sumber
Jawaban:
Menggunakan docker-compose saya bisa menggunakan node_modules secara lokal, tetapi abaikan saja dalam wadah buruh pelabuhan menggunakan sintaks berikut di
docker-compose.yml
Jadi semuanya
./angularApp
dipetakan ke/opt/app
dan kemudian saya membuat volume mount lain/opt/app/node_modules/
yang sekarang direktori kosong - bahkan jika di mesin lokal saya./angularApp/node_modules
tidak kosong.sumber
/opt/app/node_modules/
dengan direktori lain dengan nama yang sama. Kesalahan terjadi: 'volume sibuk'-v $(pwd):/build/ -v /build/node_modules
If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
Jika Anda ingin subdirektori diabaikan oleh komposisi buruh pelabuhan tetapi gigih, Anda dapat melakukan hal berikut di
docker-compose.yml
:Hal ini akan me-mount direktori Anda saat ini sebagai volume bersama, tapi me-mount volume buruh pelabuhan terus-menerus di tempat lokal Anda
node_modules
direktori. Ini mirip dengan jawaban oleh @kernix, tetapi ini akan memungkinkannode_modules
untuk bertahan di antara prosesdocker-compose up
, yang kemungkinan merupakan perilaku yang diinginkan.sumber
docker-compose down
akan menghapus wadah, tetapi volumenya akan tetap ada sampai Anda menjalankan sesuatu sepertidocker system prune
node_modules:
volume bernama "abaikan"/app/node_modules
wadah penampung, dapat menemukan posting ini bermanfaat Bagaimana buruh pelabuhan menangani beberapa jenis pemasangan?Untuk mengecualikan file, gunakan yang berikut ini
sumber
Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Menambahkan garis miring tidak membantu./dev/null
ke dalam wadah, sebagai file perangkat.Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Ini bukan apa yang dicari OP, tapi itu sangat berguna bagi saya, karena saya perlu mengecualikan satu file.Pertama, menggunakan
ADD
instruksi dalam Dockerfile sangat berbeda dari menggunakan volume (baik melalui-v
argumen kedocker run
atauVOLUME
instruksi dalam Dockerfile). TheADD
danCOPY
perintah hanya mengambil salinan file pada saatdocker build
dijalankan. File-file ini tidak diperbarui sampai gambar baru dibuat dengandocker build
perintah. Sebaliknya, menggunakan volume pada dasarnya mengatakan "direktori ini tidak boleh disimpan dalam gambar wadah; melainkan gunakan direktori pada host"; setiap kali file di dalam volume diubah, tuan rumah dan wadah akan melihatnya segera.Saya tidak percaya Anda dapat mencapai volume yang Anda inginkan, Anda harus memikirkan kembali struktur direktori Anda jika Anda ingin melakukan ini.
Namun, cukup mudah untuk menggunakan
COPY
(yang harus disukaiADD
). Anda dapat menggunakan.dockerignore
file untuk mengecualikan subdirektori, atau Anda dapat melakukanCOPY
semua file kemudianRUN rm bla
untuk menghapus subdirektori.Ingat bahwa setiap file yang Anda tambahkan ke gambar dengan
COPY
atauADD
harus berada di dalam konteks build yaitu di dalam atau di bawah direktori tempat Anda menjalankandocker build
.sumber
.dockerignore
file untuk mengecualikan sub direktori (atau bahkan direktori). Mengingat itu adalah tujuan file yang dinyatakan, itu cukup aneh.squash
lapisan. Salah satunya adalah github.com/goldmann/docker-squash dan lainnya menggunakanoc ex dockerbuild
dari proyek openshift.Sepertinya solusi lama tidak berfungsi lagi (setidaknya untuk saya). Namun, membuat folder kosong dan memetakan folder target membantu.
sumber
docker-compose 1.25.0-rc3
, sintaksis file v3.Dengan baris perintah buruh pelabuhan:
The
-v
pilihan juga dapat digunakan (kredit untuk Bogdan Mart ), tapi--mount
lebih jelas dan direkomendasikan .sumber
untuk orang-orang yang juga memiliki masalah bahwa folder node_modules masih akan menimpa dari sistem lokal Anda dan sebaliknya
Ini solusinya, Dengan membuntuti
/
setelah node_modules menjadi perbaikan.sumber
Untuk mengecualikan file yang dipasang yang terkandung dalam volume mesin Anda, Anda harus menimpanya dengan mengalokasikan volume ke file yang sama. Dalam file konfigurasi Anda:
Contoh di dockerfile Anda:
sumber