GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Apa Perbedaan Antara COPY dan ADD di Dockerfiles?

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.


Docker
  1. Apa perbedaan antara strtok_r dan strtok_s di C?

  2. Apa perbedaan antara fsck dan e2fsck?

  3. Apa perbedaan antara adduser dan useradd?

  1. Apa perbedaan antara InnoDB dan MyISAM?

  2. Apa perbedaan antara ls dan l?

  3. Apa perbedaan antara `su -` dan` su --login`?

  1. Perbedaan Antara [[ $a ==Z* ]] Dan [ $a ==Z* ]?

  2. Apa Perbedaan Antara cPanel Dan WHM?

  3. Apa perbedaan antara $(CC) dan $CC?