Apa perbedaan antara perintah COPY
dan ADD
dalam Dockerfile, dan kapan saya akan menggunakan satu di atas yang lain?
COPY <src> <dest>
Instruksi COPY akan menyalin file-file baru dari
<src>
dan menambahkannya ke sistem file kontainer di jalurnya<dest>
ADD <src> <dest>
Instruksi ADD akan menyalin file baru dari
<src>
dan menambahkannya ke sistem file kontainer di path<dest>
.
docker
dockerfile
Steve
sumber
sumber
COPY
mengeksekusi setiap kali dijalankan, karena itu tidak selalu memiliki akses ke konteks asli untuk mengambil konten.Jawaban:
Anda harus memeriksa
ADD
danCOPY
dokumentasi untuk deskripsi yang lebih rinci tentang perilaku mereka, tetapi secara singkat, perbedaan utama adalah bahwaADD
dapat melakukan lebih dariCOPY
:ADD
memungkinkan<src>
untuk menjadi URLADD
dokumentasi menyatakan bahwa:Perhatikan bahwa Praktik terbaik untuk menulis Dockerfiles menyarankan penggunaan di
COPY
mana keajaibanADD
tidak diperlukan. Jika tidak, Anda ( karena Anda harus mencari jawaban ini ) suatu hari nanti akan terkejut ketika Anda bermaksud menyalinkeep_this_archive_intact.tar.gz
ke dalam wadah Anda, tetapi sebaliknya, Anda menyemprotkan isinya ke sistem file Anda.sumber
If <src> is a local tar archive in a recognized compression format (identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources from remote URLs are not decompressed.
Docker ADDCOPY
adalahReferensi langsung dari kode sumber .
sumber
ADD
juga membuat direktori yang tidak ada . Jadi, meskipun entah bagaimana berkecil di seluruh thread ini, ini memiliki keuntungan lebihCOPY
karena Anda tidak harus menjalankanmkdir
dan menyimpan beberapa mengetikAda beberapa dokumentasi resmi tentang hal itu: Praktik Terbaik untuk Menulis Dockerfiles
sumber
COPY
, karena lebih transparan. From the Docker File Best Practices (2014-12-15):Although ADD and COPY are functionally similar, generally speaking, COPY is preferred. That’s because it’s more transparent than ADD. COPY only supports the basic copying of local files into the container, while ADD has some features that are not immediately obvious.
Dari Docker docs:
Lebih lanjut: Praktik terbaik untuk menulis Dockerfiles
sumber
Jika Anda ingin menambahkan xx.tar.gz ke a
/usr/local
dalam wadah, unzip, dan kemudian hapus paket terkompresi yang tidak berguna.Untuk COPY:
Untuk ADD:
ADD mendukung ekstraksi tar khusus lokal. Selain itu, COPY akan menggunakan tiga lapisan, tetapi ADD hanya menggunakan satu lapisan.
sumber
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local && rm /tmp/jdk-7u79-linux-x64.tar.gz
COPY
menyalin file / direktori dari host Anda ke gambar Anda.ADD
menyalin file / direktori dari host Anda ke gambar Anda, tetapi juga dapat mengambil URL jarak jauh, mengekstrak file TAR, dll ...Menggunakan
COPY
untuk hanya menyalin file dan / atau direktori ke dalam konteks build.Gunakan
ADD
untuk mengunduh sumber daya jarak jauh, mengekstraksi file TAR, dll.sumber
Dari dokumen Docker: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy
"Meskipun ADD dan COPY secara fungsional serupa, secara umum, COPY lebih disukai. Itu karena itu lebih transparan daripada ADD. COPY hanya mendukung penyalinan dasar file lokal ke dalam wadah, sementara ADD memiliki beberapa fitur (seperti ekstraksi tar lokal saja dan dukungan URL jarak jauh) yang tidak segera jelas. Akibatnya, penggunaan terbaik untuk ADD adalah ekstraksi file tar lokal ke dalam gambar, seperti pada ADD rootfs.tar.xz /.
Jika Anda memiliki beberapa langkah Dockerfile yang menggunakan file berbeda dari konteks Anda, SALINKAN secara individual, daripada sekaligus. Ini akan memastikan bahwa cache build setiap langkah hanya tidak valid (memaksa langkah untuk dijalankan kembali) jika file yang diperlukan secara khusus berubah.
Sebagai contoh:
Menghasilkan lebih sedikit cacat cache untuk langkah RUN, daripada jika Anda menggunakan COPY. / tmp / sebelumnya.
Karena ukuran gambar penting, menggunakan ADD untuk mengambil paket dari URL jarak jauh sangat tidak disarankan; Anda harus menggunakan keriting atau gantinya. Dengan begitu Anda dapat menghapus file yang tidak lagi Anda perlukan setelah diekstraksi dan Anda tidak perlu menambahkan layer lain di gambar Anda. Misalnya, Anda harus menghindari melakukan hal-hal seperti:
Dan sebaliknya, lakukan sesuatu seperti:
Untuk item lain (file, direktori) yang tidak memerlukan kemampuan ekstraksi tar otomatis ADD, Anda harus selalu menggunakan COPY. "
sumber
Sumber: https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile :
sumber
Saat membuat Dockerfile, ada dua perintah yang dapat Anda gunakan untuk menyalin file / direktori ke dalamnya -
ADD
danCOPY
. Meskipun ada sedikit perbedaan dalam lingkup fungsi mereka, mereka pada dasarnya melakukan tugas yang sama.Jadi, mengapa kita memiliki dua perintah, dan bagaimana kita tahu kapan harus menggunakan satu atau yang lain?
ADD
PERINTAH DOCKERMari kita mulai dengan mencatat bahwa
ADD
perintahnya lebih tua dariCOPY
. Sejak peluncuran platform Docker,ADD
instruksi telah menjadi bagian dari daftar perintahnya.Perintah menyalin file / direktori ke sistem file dari wadah yang ditentukan.
Sintaks dasar untuk
ADD
perintah ini adalah:Ini termasuk sumber yang ingin Anda salin (
<src>
) diikuti oleh tujuan tempat Anda ingin menyimpannya (<dest>
). Jika sumbernya adalah direktori,ADD
salin semua yang ada di dalamnya (termasuk metadata sistem file).Misalnya, jika file tersedia secara lokal dan Anda ingin menambahkannya ke direktori gambar, Anda mengetik:
ADD
juga dapat menyalin file dari URL. Itu dapat mengunduh file eksternal dan menyalinnya ke tujuan yang diinginkan. Sebagai contoh:Fitur tambahan adalah bahwa ia menyalin file terkompresi, secara otomatis mengekstraksi konten di tujuan yang diberikan. Fitur ini hanya berlaku untuk file / direktori terkompresi yang disimpan secara lokal.
Ingatlah bahwa Anda tidak dapat mengunduh dan mengekstrak file / direktori terkompresi dari URL. Perintah tidak membongkar paket eksternal ketika menyalinnya ke sistem file lokal.
BURUH PELABUHAN
COPY
PERINTAHKarena beberapa masalah fungsionalitas, Docker harus memperkenalkan perintah tambahan untuk menggandakan konten -
COPY
.Tidak seperti
ADD
perintah yang terkait erat ,COPY
hanya memiliki satu fungsi yang ditugaskan. Perannya adalah untuk menduplikasi file / direktori di lokasi yang ditentukan dalam format yang ada. Ini berarti bahwa itu tidak berurusan dengan mengekstraksi file terkompresi, melainkan menyalinnya apa adanya.Instruksi hanya dapat digunakan untuk file yang disimpan secara lokal. Karenanya, Anda tidak dapat menggunakannya dengan URL untuk menyalin file eksternal ke wadah Anda.
Untuk menggunakan
COPY
instruksi, ikuti format perintah dasar:Ketik sumber dan di mana Anda ingin perintah untuk mengekstrak konten sebagai berikut:
Sebagai contoh:
Perintah mana yang digunakan? (Praktik Terbaik)
Mempertimbangkan keadaan di mana
COPY
perintah itu diperkenalkan, jelas bahwa menjagaADD
adalah masalah kebutuhan. Docker merilis dokumen resmi yang menguraikan praktik terbaik untuk menulis Dockerfiles, yang secara eksplisit menyarankan agar tidak menggunakanADD
perintah.Dokumentasi resmi Docker mencatat bahwa
COPY
harus selalu menjadi instruksi masuk karena lebih transparan daripadaADD
.Jika Anda perlu menyalin dari konteks pembangunan lokal ke dalam wadah, tetap gunakan
COPY
.Tim Docker juga sangat tidak menyarankan
ADD
untuk mengunduh dan menyalin paket dari URL. Sebaliknya, lebih aman dan lebih efisien untuk menggunakan wget atau curl dalam sebuahRUN
perintah. Dengan melakukannya, Anda menghindari membuat lapisan gambar tambahan dan menghemat ruang.sumber
Catatan penting
Saya harus
COPY
dan untar paket java di gambar buruh pelabuhan saya. Ketika saya membandingkan ukuran gambar buruh pelabuhan yang dibuat menggunakan ADD itu 180MB lebih besar dari yang dibuat menggunakan COPY, tar -xzf * .tar.gz dan rm * .tar.gzIni berarti bahwa meskipun ADD menghapus file tar, ia masih disimpan di suatu tempat. Dan itu membuat gambar lebih besar !!
sumber
Karena Docker 17.05
COPY
digunakan dengan--from
bendera dalam pembuatan multi-tahap untuk menyalin artefak dari tahap pembuatan sebelumnya ke tahap pembuatan saat ini.dari dokumentasi
sumber
Ini adalah cara lain untuk menyalin file ke gambar. Opsi -v untuk sementara membuat volume yang kami gunakan selama proses build.
Ini berbeda dengan volume lainnya karena ia me-mount direktori host untuk build saja. File dapat disalin menggunakan perintah cp standar.
Juga, seperti curl dan wget, itu dapat dijalankan dalam tumpukan perintah (berjalan dalam satu wadah) dan tidak mengalikan ukuran gambar. ADD dan COPY tidak dapat ditumpuk karena mereka berjalan dalam wadah mandiri dan perintah selanjutnya pada file-file yang dieksekusi dalam wadah tambahan akan melipatgandakan ukuran gambar:
Dengan opsi yang diatur sebagai berikut:
Berikut ini akan dieksekusi dalam satu wadah:
sumber
unknown shorthand flag: 'v' in -v