Dockerfile kullanarak tek bir katmanda birden çok dosya nasıl kopyalanır?


246

Aşağıdakiler Dockerfiledört COPYkatman içerir :

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

Bunun yerine bu dosyaları tek bir katman kullanarak nasıl kopyalayabilirim? Aşağıdakiler denendi:

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

Yanıtlar:


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

veya

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

Kaynak dosya belirtiminde joker karakterler de kullanabilirsiniz. Biraz daha ayrıntılı bilgi için dokümanlara bakın .

Dizinler özel! Yazarsan

COPY dir1 dir2 ./

aslında böyle çalışıyor

COPY dir1/* dir2/* ./

Tek bir komutta birden çok dizini (içeriklerini değil) bir hedef dizin altına kopyalamak istiyorsanız, kaynak dizinlerinizin ortak bir üst öğe ve ardından COPYo üst öğe altında olması için derleme bağlamını ayarlamanız gerekir .


53
Kaynaklar dizinse , dizinlerin kendilerini değil, dizin içeriğini kopyalar .
Claudiu

7
Hedef dizinin aynı olduğuna dikkat edin. Farklı hedefleri olan çok sayıda farklı dosya yaparsanız, bir bindirme dosya sistemi (kroot gibi) oluşturmayı, ardından bunu bir tararşive dönüştürmeyi ve ADD ile eklemeyi düşünebilirsiniz .
tu-Reinstate Monica-dor duh

4
@Claudiu Klasörler nasıl kopyalanır?
k0pernikus

5
@ k0pernikus KOPYA myDir1 ./MyDir1/ diyebilirsiniz
Manuel Manhart

@ manuel-manhart Bir Build Parametresi kullanarak dosya listesini parametreleştirip getiremeyeceğimizi bilen var mı? github.com/moby/moby/issues/38532 ?
Marcello de Sales

52
COPY <all> <the> <things> <last-arg-is-destination>

Ancak burada dokümanlardan önemli bir alıntı var:

Bağlamınızdan farklı dosyalar kullanan birden fazla Dockerfile adımınız varsa, bunları bir kerede değil, tek tek kopyalayın. Bu, özel olarak gerekli dosyalar değişirse her adımın derleme önbelleğinin yalnızca geçersiz kılınmasını sağlar (adımı yeniden çalıştırmaya zorlar).

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


"her şeyi" parametreleştirebilir miyiz biliyor musunuz ??? Derleme parametreleri mi kullanıyorsunuz? github.com/moby/moby/issues/38532 ???
Marcello de Sales

@MarcellodeSales neden buna ihtiyacınız olduğundan emin değil. Neden bu dosyalar olmadan bir temel görüntü oluşturmuyorsunuz ve daha sonra alt resimlerde kopyalama talimatı var - yolu zaten tanımlamaları gerekiyorsa, çok fazla fark yaratmıyor. Ya da sadece görüntü (ler) i tamamen dışarıda bırakıp konteynere monte edebilirsiniz - orada bu yapılandırılabilir olması için .env dosyalarınız var.
Manuel Manhart

Ayrıca, her zaman zaten mevcut bir yolun üzerine kopyalayabilirsiniz, çünkü dosya sistemi katmanlı olduğundan, önceden var olan içeriğin üzerine biner / gölgelendirir.
Manuel Manhart

@ManuelManhart, ONBUILD COPY ile Dinamik Parametreli Bir Görüntü Oluşturuyorum ... Bir Platformun parçası olarak, görüntüde yapılması gerekenlerin karmaşıklığını gizliyorum, bu yüzden bu yüzden değerlerin sağlanmasına ihtiyacım var parametre olarak.
Marcello de Sales

@MarcellodeSales Bunun şu an / henüz desteklendiğini düşünmüyorum. Ancak onu oluşturmak için derleme bağımsız değişkenlerini kullanabilirsiniz, bkz. Stackoverflow.com/questions/43654656/…
Manuel Manhart

7

basit

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

dan doc

Doğrudan veya bir joker karakter kullanımı nedeniyle birden çok kaynak belirtilirse, bir dizin olmalı ve / / ile bitmelidir.


6

Bu değer aynı zamanda bir yaratabilir söz olabilir .dockerignore, dosyayı o dosyaları dışlamak için değil kopyalamak istiyorum:

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

Docker CLI, içeriği docker arka plan programına göndermeden önce, içeriğin kök dizininde .dockerignore adlı bir dosya arar. Bu dosya varsa, CLI, içindeki kalıplarla eşleşen dosyaları ve dizinleri hariç tutmak için içeriği değiştirir. Bu, arka plana gereksiz yere büyük veya hassas dosyalar ve dizinler göndermekten ve bunları ADD veya COPY kullanarak görüntülere eklemekten kaçınmaya yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.