Saya mempelajari Docker dan saya ragu tentang kapan dan di mana harus menggunakan ADD
dan VOLUME
. Inilah yang menurut saya dilakukan oleh keduanya:
MENAMBAHKAN
Salin file ke gambar pada waktu pembuatan. Gambar memiliki semua file sehingga Anda dapat menerapkannya dengan sangat mudah. Di sisi lain, perlu membangun setiap saat bukanlah ide yang baik dalam pengembangan karena pembangunan memerlukan pengembang untuk menjalankan perintah untuk membangun kembali kontainer; Selain itu, membangun wadah bisa memakan waktu.
VOLUME
Saya memahami bahwa menggunakan docker run -v
Anda dapat memasang folder host di dalam penampung Anda, dengan cara ini Anda dapat dengan mudah memodifikasi file dan melihat aplikasi di penampung Anda bereaksi terhadap perubahan. Ini terlihat bagus dalam pengembangan, tetapi saya tidak yakin bagaimana menyebarkan file saya dengan cara ini.
COPY
untukADD
. Mereka hampir sama, tetapiADD
memiliki beberapa kemampuan ekstra untuk menulis URL dan file arsip yang dapat mengejutkan.Jawaban:
MENAMBAHKAN
Perbedaan mendasar antara keduanya adalah
ADD
membuat apa pun yang Anda tambahkan, baik itu folder atau hanya file yang sebenarnya menjadi bagian dari gambar Anda . Siapa pun yang menggunakan gambar yang Anda buat setelah itu akan memiliki akses ke apa pun AndaADD
. Ini benar bahkan jika Anda kemudian menghapusnya karena Docker berfungsi dalam lapisan danADD
lapisan tersebut akan tetap ada sebagai bagian dari gambar. Untuk lebih jelasnya, Anda hanya memilikiADD
sesuatu pada waktu pembuatan dan tidak pernah dapatADD
pada saat berjalan.Beberapa contoh kasus yang ingin Anda gunakan
ADD
:ADD ./requirements.txt /requirements.txt
diikuti olehRUN pip install -r /requirements.txt
Anda ingin menggunakan kode aplikasi Anda sebagai konteks di Dockerfile Anda, misalnya, jika Anda ingin menyetel direktori aplikasi Anda sebagai direktori kerja di gambar Anda dan agar perintah default dalam wadah dijalankan dari gambar Anda benar-benar menjalankan aplikasi Anda, Anda bisa melakukan:
ADD ./ /usr/local/git/my_app
WORKDIR /usr/local/git/my_app
CMD python ./main.py
VOLUME
Volume, di sisi lain, hanya memungkinkan sebuah kontainer berjalan dari gambar Anda memiliki akses ke beberapa jalur di mesin lokal apa pun tempat kontainer sedang dijalankan. Anda tidak dapat menggunakan file dari
VOLUME
direktori Anda di Dockerfile . Apa pun yang ada di direktori volume Anda tidak akan dapat diakses pada waktu pembuatan, tetapi akan dapat diakses pada waktu proses .Beberapa contoh kasus yang ingin Anda gunakan
VOLUME
:/var/log/my_app
. Anda ingin log tersebut dapat diakses di mesin host dan tidak dihapus saat container dihapus. Anda dapat melakukan ini dengan membuat titik pemasangan di/var/log/my_app
dengan menambahkanVOLUME /var/log/my_app
ke Dockerfile Anda dan kemudian menjalankan container Anda dengandocker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag
VOLUME /etc/settings/my_app_settings
ke Dockerfile Anda, menjalankan container Anda dengandocker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tag
, dan memastikan / host / settings / dir ada di semua lingkungan yang Anda harapkan untuk menjalankan aplikasi Anda.sumber
docker run -v $HOST_PATH:$CONTAINER_PATH node:latest node $CONTAINER_PATH/app.js
.The
VOLUME
instruksi menciptakan volume data dalam kontainer Docker Anda saat runtime. Direktori yang diberikan sebagai argumen keVOLUME
adalah direktori yang melewati Sistem File Union , dan terutama digunakan untuk data persisten dan bersama.Jika Anda menjalankan
docker inspect <your-container>
, Anda akan melihat di bawahMounts
bagian adaSource
yang mewakili lokasi direktori pada host, danDestination
yang mewakili lokasi direktori yang dipasang di wadah. Sebagai contoh,Berikut 3 kasus penggunaan untuk
docker run -v
:docker run -v /data
: Ini analog dengan menentukanVOLUME
instruksi di Dockerfile Anda.docker run -v $host_path:$container_path
: Ini memungkinkan Anda untuk memasang$host_path
dari host Anda ke$container_path
dalam penampung Anda selama runtime. Dalam pengembangan, ini berguna untuk berbagi kode sumber di host Anda dengan penampung. Dalam produksi, ini dapat digunakan untuk memasang hal-hal seperti informasi DNS host (ditemukan di/etc/resolv.conf
) atau rahasia ke dalam penampung. Sebaliknya, Anda juga dapat menggunakan teknik ini untuk menulis log penampung ke dalam folder tertentu di host. Keduanya$host_path
dan$container_path
harus jalur absolut.docker run -v my_volume:$container_path
: Ini membuat volume data dalam penampung Anda di$container_path
dan menamainyamy_volume
. Ini pada dasarnya sama dengan membuat dan menamai volume menggunakandocker volume create my_volume
. Penamaan volume seperti ini berguna untuk volume data kontainer dan volume penyimpanan bersama menggunakan driver penyimpanan multi-host seperti Flocker .Perhatikan bahwa pendekatan pemasangan folder host sebagai volume data tidak tersedia di Dockerfile. Mengutip dokumentasi buruh pelabuhan ,
Sekarang jika Anda ingin menyalin file Anda ke kontainer di lingkungan non-pengembangan, Anda dapat menggunakan
ADD
atauCOPY
instruksi di Dockerfile Anda. Ini adalah apa yang biasanya saya gunakan untuk penerapan non-pengembangan.sumber
ADD
instruksi di Dockerfile Anda, karena ini hanya dijalankan olehdocker build
perintah. Ini diperlukan saat orang lain membangun penampung Anda untuk pertama kali, dan saat Anda siap untuk menerapkannya ke lingkungan non-pengembangan lainnya.-v
perintah untuk pengembangan, dan meminta file buruh pelabuhan lain membuat gambar yang menyertakan fileADD
untuk penyebaran?ADD
waktu itu? Total beberapa detik? Jika Anda memiliki dua file Dockerfile, dan Anda membaginya dengan orang lain (atau menerbitkannya di registri buruh pelabuhan ), mana yang default? Anda akan memiliki beberapa overhead pemeliharaan tambahan untuk memastikan Dockerfile default yang benar sampai ke pengguna yang tepat. Tetapi pada akhirnya, Anda memutuskan mana yang terbaik untuk Anda. Secara pribadi, saya ingin memastikan bahwa hanya ada satu Dockerfile untuk membangun container saya.