Pendahuluan
Saat membuat Dockerfile, ada dua perintah yang dapat Anda gunakan untuk menyalin file/direktori ke dalamnya – ADD
dan COPY
. Meskipun ada sedikit perbedaan dalam ruang lingkup fungsinya, mereka pada dasarnya melakukan tugas yang sama.
Jadi, mengapa kita memiliki dua perintah, dan bagaimana kita tahu kapan harus menggunakan satu atau yang lain?
Dalam artikel ini, kami menjelaskan setiap perintah, menganalisis Docker ADD vs COPY, dan memberi tahu Anda mana yang harus digunakan.
Perintah TAMBAH Docker
Mari kita mulai dengan mencatat bahwa ADD
perintah lebih lama dari COPY
. 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
perintahnya adalah:
ADD <src> … <dest>
Ini termasuk sumber yang ingin Anda salin (<src>
) diikuti dengan tujuan di mana Anda ingin menyimpannya (<dest>
). Jika sumbernya adalah direktori, ADD
menyalin semua yang ada di dalamnya (termasuk metadata sistem file).
Misalnya, jika file tersedia secara lokal dan Anda ingin menambahkannya ke direktori gambar, ketik:
ADD /source/file/path /destination/path
ADD
juga dapat menyalin file dari URL. Itu dapat mengunduh file eksternal dan menyalinnya ke tujuan yang diinginkan. Misalnya:
ADD http://source.file/url /destination/path
Fitur tambahannya adalah ia menyalin file terkompresi, secara otomatis mengekstraksi konten di tujuan yang diberikan. Fitur ini hanya berlaku untuk file/direktori terkompresi yang disimpan secara lokal.
Ketik sumber dan di mana Anda ingin perintah untuk mengekstrak konten sebagai berikut:
ADD source.file.tar.gz /temp
Ingatlah bahwa Anda tidak dapat mengunduh dan mengekstrak file/direktori terkompresi dari URL. Perintah tidak membongkar paket eksternal saat menyalinnya ke sistem file lokal.
Perintah Salin Docker
Karena beberapa masalah fungsionalitas, Docker harus memperkenalkan perintah tambahan untuk menduplikasi konten – COPY
.
Tidak seperti ADD
yang terkait erat perintah, COPY
hanya memiliki satu fungsi yang ditugaskan. Perannya adalah untuk menduplikasi file/direktori di lokasi tertentu dalam format yang ada. Ini berarti bahwa itu tidak berurusan dengan mengekstrak file terkompresi, melainkan menyalinnya apa adanya.
Instruksi hanya dapat digunakan untuk file yang disimpan secara lokal. Oleh karena itu, Anda tidak dapat menggunakannya dengan URL untuk menyalin file eksternal ke penampung Anda.
Untuk menggunakan COPY
instruksi, ikuti format perintah dasar:
COPY <src> … <dest>
Misalnya:
COPY /source/file/path /destination/path
Salin Docker vs ADD
Mengapa ada kebutuhan untuk menambahkan perintah baru yang serupa?
Fakta bahwa ADD
memiliki begitu banyak fungsi yang terbukti bermasalah dalam praktiknya, karena berperilaku sangat tidak terduga. Hasil dari kinerja yang tidak dapat diandalkan seperti itu sering kali disebabkan oleh penyalinan saat Anda ingin mengekstrak dan ekstraksi saat Anda ingin menyalin.
Docker tidak dapat sepenuhnya mengganti perintah karena banyaknya penggunaan yang ada. Untuk menghindari kompatibilitas mundur, opsi teraman adalah menambahkan COPY
command – perintah yang kurang beragam namun lebih andal.
Yang Digunakan (Praktik Terbaik)
Mempertimbangkan keadaan di mana COPY
perintah diperkenalkan, terbukti bahwa menjaga ADD adalah suatu keharusan. Docker merilis dokumen resmi yang menguraikan praktik terbaik untuk menulis Dockerfiles, yang secara eksplisit menyarankan untuk tidak menggunakan ADD
perintah .
Dokumentasi resmi Docker mencatat bahwa COPY
harus selalu menjadi petunjuk masuk karena lebih transparan daripada ADD
.
Jika Anda perlu menyalin dari konteks build lokal ke dalam wadah, tetap gunakan COPY
.
Tim Docker juga sangat tidak menganjurkan penggunaan ADD
untuk mengunduh dan menyalin paket dari URL. Sebaliknya, lebih aman dan lebih efisien menggunakan wget atau ikal dalam RUN
memerintah. Dengan melakukannya, Anda menghindari membuat lapisan gambar tambahan dan menghemat ruang.
Katakanlah Anda ingin mengunduh paket terkompresi dari URL, mengekstrak konten, dan membersihkan arsip.
Alih-alih menggunakan ADD
dan jalankan perintah berikut:
ADD http://source.file/package.file.tar.gz /temp
RUN tar -xjf /temp/package.file.tar.gz \
&& make -C /tmp/package.file \
&& rm /tmp/ package.file.tar.gz
Anda harus menggunakan:
RUN curl http://source.file/package.file.tar.gz \
| tar -xjC /tmp/ package.file.tar.gz \
&& make -C /tmp/ package.file.tar.gz