ADD
dan COPY
adalah dua Dockerfile
yang serupa petunjuk yang memungkinkan Anda menambahkan konten ke gambar Anda pada waktu pembuatan. Sedangkan COPY
adalah sumber langsung ke salinan tujuan, ADD
menyertakan fungsionalitas ekstra untuk bekerja dengan arsip dan URL jarak jauh.
SALIN
COPY
adalah yang paling sederhana dari dua instruksi. Ia menerima dua argumen, sumber dan tujuan:
COPY example.txt /example/dir/example.txt
Jalur sumber akan disalin dari host Docker Anda ke sistem file penampung. Gambar yang dibuat akan menyertakan file atau direktori yang disalin di jalur tujuan yang ditentukan.
COPY
bekerja dengan semua file dan direktori tetapi jalur sumber dibatasi untuk yang ada dalam konteks build aktif Anda. Konteks disetel saat Anda menjalankan docker build
:
docker build . # OR docker build /path/to/context
Instruksi secara otomatis membuat direktori tujuan dalam wadah ketika belum ada. Jika Anda menyertakan garis miring (/
), Docker memperlakukan tujuan sebagai direktori dan akan menempatkan file sumber di dalamnya.
Anda dapat menggunakan wildcard seperti *.jpg
di tujuan jalur sumber untuk mencocokkan satu set file. Ekspresi ini akan diuraikan menggunakan filepath
Go korek api.
File yang disalin memiliki UID dan GID 0 secara default. Ini dapat disesuaikan dengan --chown
opsional flag yang menerima UID, GID, dan nama. Ini menjalankan chown
pada file yang disalin setelah berada di dalam wadah:
COPY --chown=my-user:my-group example.txt /example.txt
COPY
juga mendukung --from
bendera. Ini memodifikasi jalur sumber untuk merujuk ke lainnya gambar container, alih-alih konteks build lokal Anda. Ini juga berfungsi dengan build multi-tahap untuk menarik artefak yang dibuat oleh tahapan build sebelumnya.
# Copies /usr/bin/composer from the composer:latest image COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Multi-stage build example # Stage 1: Copies example.scss from working directory into node:latest image # Stage 2: Copies example.css built in stage 1 into the final image (based on httpd:latest) FROM node:latest AS sass COPY example.scss . RUN npm install -g node-sass && node-sass example.scss example.css FROM httpd:latest COPY --from=sass /example.css example.css
--from
bendera harus merujuk ke tahap bernama yang terdaftar sebelumnya di Dockerfile
. Saat tidak ada tahap yang cocok, Docker menganggap Anda mereferensikan gambar. Anda akan mengalami kesalahan pembuatan jika gambar tidak dapat ditarik.
TAMBAHKAN
ADD
memiliki sintaks yang sama dengan COPY
, menerima jalur sumber dan tujuan. Tidak ada dukungan untuk --from
tetapi Anda dapat menggunakan --chown
.
Tidak seperti COPY
, ADD
mampu mengunduh URL file jarak jauh. Menentukan URL yang dapat diakses publik sebagai jalur sumber akan mengunduh file itu dan menambahkannya ke gambar penampung. Waktu modifikasi jalur tujuan (mtime
) akan disetel ke nilai Last-Modified
header di respons HTTP unduhan.
ADD
juga dapat mengekstrak arsip tar, termasuk arsip yang dikompresi dengan gzip, bzip2, dan xz. Menentukan arsip yang kompatibel sebagai jalur sumber akan membongkar isinya ke dalam direktori penampung yang ditentukan. Konten direktori yang ada akan dipertahankan.
Deteksi arsip didasarkan pada konten file yang sebenarnya, bukan nama file atau ekstensi. Anda dapat menggunakan file arsip asli apa pun tanpa menamainya .tar
, .tar.gz
atau .tar.xz
.
Kemampuan untuk mengekstrak arsip secara otomatis menyederhanakan penambahan paket perangkat lunak yang didistribusikan sebagai file tar ke gambar kontainer Anda. Menyediakan jalur tar ke COPY
akan menyalin file arsip terkompresi apa adanya, bukan isinya. Anda harus menggunakan RUN
instruksi untuk mendekompresi file secara manual.
Perilaku seputar COPY
berlaku untuk ADD
ke. Kecuali untuk URL jarak jauh, jalur sumber harus ada dalam konteks build Anda. Jalur tujuan penampung akan dibuat secara otomatis saat tidak ada menggunakan aturan Docker untuk resolusi jalur.
Ringkasan
COPY
dan ADD
adalah dua instruksi yang terkait erat tetapi jelas berbeda yang dapat Anda gunakan saat menulis Dockerfile
. Karena set fitur mereka tumpang tindih, Anda mungkin bertanya-tanya mana yang "terbaik" untuk digunakan secara default.
Menurut panduan praktik terbaik Docker sendiri, Anda harus menjangkau COPY
kecuali Anda membutuhkan kemampuan ekstra ADD
. ADD
adalah operasi buram yang menambahkan keajaiban pada proses penyalinan.
Hanya menggunakan ADD
ketika itu benar-benar dibutuhkan membantu mengomunikasikan niat Anda. Jika tidak, Anda berisiko membuat anggota tim terbiasa menggunakan ADD
yang bisa berakibat fatal. ADD my-archive.tar .
. yang tidak disengaja alih-alih COPY my-archive.tar
dapat menyebabkan kebingungan dan build yang rusak saat konten arsip muncul di penampung Anda, bukan di arsip itu sendiri.
Anda juga harus mempertimbangkan dengan cermat kapan waktu yang tepat untuk menggunakan ADD
dengan URL jarak jauh. Akan lebih efisien menggunakan curl
atau wget
dengan RUN
instruksi karena ini membantu memfasilitasi caching lapisan gambar. Sebuah ADD
instruksi akan selalu membatalkan cache untuk semua tahap pembuatan berikut saat file di URL jarak jauh berubah.
Jika memungkinkan, sebaiknya hapus file yang disalin setelah digunakan. Jika Anda mengunduh atau mengekstrak penginstal perangkat lunak, menghapus biner satu kali setelah Anda menjalankannya akan membantu memperkecil gambar akhir Anda.