Bagaimana cara menyalin beberapa file dalam satu layer menggunakan Dockerfile?

246

Berikut ini Dockerfileberisi empat COPYlapisan:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

Bagaimana cara menyalin file-file ini menggunakan satu lapisan saja? Berikut ini dicoba:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]
kazhuravlev
sumber

Jawaban:

427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

atau

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

Anda juga dapat menggunakan karakter wildcard dalam spesifikasi sourcefile. Lihat dokumen untuk sedikit lebih detail .

Direktori spesial! Jika kamu menulis

COPY dir1 dir2 ./

yang benar-benar berfungsi

COPY dir1/* dir2/* ./

Jika Anda ingin menyalin beberapa direktori (bukan isinya) di bawah direktori tujuan dalam satu perintah, Anda harus mengatur konteks build sehingga direktori sumber Anda berada di bawah induk yang sama dan kemudian COPYinduk tersebut.

Nathaniel Waisbrot
sumber
53
Perhatikan bahwa jika sumbernya adalah direktori, ini menyalin isi direktori , bukan direktori itu sendiri.
Claudiu
7
Perhatikan juga bahwa direktori tujuan sama. Jika Anda melakukan banyak file yang berbeda dengan tujuan yang berbeda, maka Anda mungkin ingin mempertimbangkan membangun sistem file overlay (seperti chroot), kemudian mengubahnya menjadi tararsip, dan menambahkannya dengan ADD.
tu-Reinstate Monica-dor duh
4
@Claudiu Bagaimana cara menyalin folder itu sendiri?
k0pernikus
5
@ k0pernikus, Anda bisa mengatakan COPY myDir1 ./MyDir1/
Manuel Manhart
@ manuel-manhart Apakah ada orang yang tahu jika kita bisa membuat parameter daftar file menggunakan Build Parameter? github.com/moby/moby/issues/38532 ?
Marcello de Sales
52
COPY <all> <the> <things> <last-arg-is-destination>

Tapi di sini ada kutipan penting dari dokumen:

Jika Anda memiliki beberapa langkah Dockerfile yang menggunakan file berbeda dari konteks Anda, SALINKAN secara individual, bukan sekaligus. Ini memastikan bahwa cache build setiap langkah hanya tidak valid (memaksa langkah untuk dijalankan kembali) jika file yang diperlukan secara khusus berubah.

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy

swapsCAPS
sumber
apakah Anda tahu kalau kami bisa membuat parameter "semua hal" ??? Menggunakan parameter build? github.com/moby/moby/issues/38532 ???
Marcello de Sales
@MarcellodeSales tidak yakin mengapa Anda membutuhkannya. Mengapa Anda tidak membuat gambar dasar tanpa file-file ini dan kemudian gambar anak memiliki instruksi penyalinan di dalamnya - jika mereka perlu menentukan jalurnya, itu tidak membuat banyak perbedaan. Atau Anda bisa membiarkannya keluar dari gambar sepenuhnya dan memasangnya ke wadah - di sana Anda memiliki file .env agar konfigurasi ini dapat dikonfigurasi.
Manuel Manhart
Anda juga selalu dapat menyalin melalui jalur yang ada, karena sistem file berlapis, itu akan tumpang tindih / membayangi konten yang sudah ada sebelumnya.
Manuel Manhart
@ManuelManhart, saya sedang membangun Gambar Parameter Dinamis dengan SALINAN ONBUILD ... Sebagai bagian dari Platform, saya menyembunyikan kerumitan apa yang perlu dilakukan dalam gambar, jadi, itulah mengapa saya perlu nilai yang diberikan sebagai parameter.
Marcello de Sales
@MarcellodeSales Saya tidak berpikir ini didukung sekarang / belum. Tapi Anda bisa menggunakan argumen build untuk merangkumnya, lihat stackoverflow.com/questions/43654656/…
Manuel Manhart
7

sederhana

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

dari doc

Jika beberapa sumber ditentukan, baik secara langsung atau karena penggunaan wildcard, maka harus berupa direktori, dan harus diakhiri dengan slash /.

Edwin Ikechukwu Okonkwo
sumber
6

Mungkin perlu disebutkan bahwa Anda juga dapat membuat .dockerignorefile, untuk mengecualikan file yang tidak ingin Anda salin:

https://docs.docker.com/engine/reference/builder/#dockerignore-file

Sebelum buruh pelabuhan, CLI mengirimkan konteks ke daemon buruh pelabuhan, ia mencari file bernama .dockerignore di direktori root konteks. Jika file ini ada, CLI memodifikasi konteks untuk mengecualikan file dan direktori yang cocok dengan pola di dalamnya. Ini membantu untuk menghindari pengiriman file dan direktori yang besar atau sensitif ke daemon dan berpotensi menambahkannya ke gambar menggunakan ADD atau COPY.

Harun
sumber