Pertanyaan Apa perbedaan antara perintah `COPY` dan` ADD` dalam Dockerfile?


Apa perbedaan antara COPY dan ADD perintah dalam Dockerfile, dan kapan saya akan menggunakan salah satu dari yang lain?


COPY <src> <dest>

Instruksi COPY akan menyalin file baru dari <src> dan tambahkan ke   filesystem wadah di jalur <dest>


ADD <src> <dest>

Instruksi ADD akan menyalin file baru dari <src> dan menambahkannya ke   filesystem container di jalan <dest>.


1483
2017-07-25 14:31


asal


Jawaban:


Anda harus memeriksa ADD dan COPY dokumentasi untuk uraian lengkap tentang perilaku mereka, tetapi secara singkat perbedaan utamanya adalah itu ADD dapat melakukan lebih dari COPY:

  • ADD memungkinkan <src> menjadi sebuah URL
  • Jika itu <src> parameter dari ADD adalah arsip dalam format kompresi yang dikenali, itu akan dibongkar

Perhatikan bahwa Praktik terbaik untuk menulis Dockerfiles menyarankan menggunakan COPY dimana keajaiban ADD tidak diperlukan. Kalau tidak, Anda (karena Anda harus mencari jawaban ini) kemungkinan akan terkejut suatu saat ketika Anda bermaksud untuk menyalin keep_this_archive_intact.tar.gz ke dalam wadah Anda, tetapi Anda malah menyemprot konten ke sistem file Anda.


1482
2017-07-25 14:52



COPY aku s

Sama seperti 'ADD', tetapi tanpa tar dan penanganan URL jarak jauh.

Referensi langsung dari kode sumber.


294
2017-09-30 16:13



Ada beberapa dokumentasi resmi tentang hal itu: Praktik Terbaik untuk Menulis File Docker 

Karena ukuran gambar penting, menggunakan ADD untuk mengambil paket dari URL jauh sangat tidak disarankan; kamu harus menggunakan curl atau wget sebagai gantinya. Dengan begitu Anda dapat menghapus file yang tidak lagi Anda butuhkan setelah diekstraksi dan Anda tidak perlu menambahkan lapisan lain di gambar Anda.

RUN mkdir -p /usr/src/things \
  && curl -SL http://example.com/big.tar.gz \
    | tar -xJC /usr/src/things \
  && make -C /usr/src/things all

Untuk item lain (file, direktori) yang tidak diperlukan ADDKemampuan ekstraksi tar otomatis, Anda harus selalu menggunakannya COPY.


116
2017-10-02 08:21



Dari dokumen Docker:

TAMBAHKAN atau SALIN

Meskipun ADD dan COPY secara fungsional serupa, secara umum, COPY lebih disukai. Itu karena 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 terlihat jelas. Konsekuensinya, penggunaan terbaik untuk ADD adalah ekstraksi file tar lokal otomatis ke dalam gambar, seperti pada ADD rootfs.tar.xz /.

Lebih: Praktik terbaik untuk menulis Dockerfiles


95
2017-08-10 15:19



Jika Anda ingin menambahkan xx.tar.gz ke a /usr/local dalam wadah, unzip, dan kemudian hapus paket terkompresi yang tidak berguna.

Untuk SALIN:

COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz

Untuk TAMBAHKAN:

ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/

ADD mendukung ekstraksi tar lokal saja. Selain itu, COPY akan menggunakan tiga lapisan, tetapi ADD hanya menggunakan satu lapisan.


26
2018-04-25 07:07



Dari dokumen Docker: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy

"Meskipun ADD dan COPY secara fungsional mirip, secara umum, COPY lebih disukai. Itu karena 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 otomatis ke dalam gambar, seperti pada ADD rootfs.tar.xz /.

Jika Anda memiliki beberapa langkah Dockerfile yang menggunakan file berbeda dari konteks Anda, COPY mereka secara individual, daripada semuanya sekaligus. Ini akan memastikan bahwa cache pembuatan setiap langkah hanya tidak valid (memaksa langkah untuk dijalankan ulang) jika perubahan file yang diperlukan secara khusus.

Sebagai contoh:

 COPY requirements.txt /tmp/
 RUN pip install --requirement /tmp/requirements.txt
 COPY . /tmp/

Menghasilkan lebih sedikit pembatalan cache untuk langkah RUN, daripada jika Anda menempatkan COPY. / tmp / sebelum itu.

Karena ukuran gambar penting, penggunaan ADD untuk mengambil paket dari URL jauh sangat tidak disarankan; Anda harus menggunakan curl atau wget sebagai gantinya. Dengan begitu Anda dapat menghapus file yang tidak lagi Anda perlukan setelah diekstrak dan Anda tidak perlu menambahkan lapisan lain di gambar Anda. Misalnya, Anda harus menghindari melakukan hal-hal seperti:

 ADD http://example.com/big.tar.xz /usr/src/things/
 RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
 RUN make -C /usr/src/things all

Dan sebagai gantinya, lakukan sesuatu seperti:

 RUN mkdir -p /usr/src/things \
     && curl -SL htt,p://example.com/big.tar.xz \
     | tar -xJC /usr/src/things \
     && make -C /usr/src/things all

Untuk item lain (file, direktori) yang tidak memerlukan kemampuan ekstraksi tar otomatis, Anda harus selalu menggunakan COPY. "


11
2018-06-12 05:29



Catatan penting

Saya harus menyalin dan untar paket java di gambar buruh pelabuhan saya. Ketika saya membandingkan ukuran gambar buruh pelabuhan yang dibuat menggunakan ADD, itu adalah 180MB lebih besar dari yang dibuat menggunakan COPY, tar -xzf * .tar.gz dan rm * .tar.gz

Ini berarti bahwa meskipun ADD menghapus file tar, itu masih disimpan di suatu tempat. Dan itu membuat imej besar !!


0
2018-06-07 08:00