Come copiare più file in un livello usando un Dockerfile?


246

Quanto segue Dockerfilecontiene quattro COPYlivelli:

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

Come copiare questi file usando invece un layer? È stato provato quanto segue:

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

Risposte:


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

o

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

È inoltre possibile utilizzare caratteri jolly nella specifica del file di origine. Vedi i documenti per un po 'più di dettagli .

Le directory sono speciali! Se scrivi

COPY dir1 dir2 ./

che funziona davvero come

COPY dir1/* dir2/* ./

Se si desidera copiare più directory (non il loro contenuto) in una directory di destinazione in un singolo comando, è necessario impostare il contesto di compilazione in modo che le directory di origine si trovino in un genitore comune e quindi in COPYquel genitore.


53
Notare che se le fonti sono directory, questo copia il contenuto della directory , non le directory stesse.
Claudiu,

7
Si noti inoltre che la directory di destinazione è la stessa. Se fai molti file diversi con destinazioni diverse, potresti prendere in considerazione la costruzione di un filesystem overlay (come un chroot), quindi trasformarlo in un tararchivio e aggiungerlo con ADD.
tu-Reinstate Monica-dor duh,

4
@Claudiu Come copiare le cartelle stesse?
k0pernikus,

5
@ k0pernikus puoi dire COPIA myDir1 ./MyDir1/
Manuel Manhart,

@ manuel-manhart C'è qualcuno che sa se possiamo parametrizzare l'elenco dei file usando un parametro di costruzione? github.com/moby/moby/issues/38532 ?
Marcello de Sales,

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

Ma ecco un estratto importante dai documenti:

Se hai più passaggi Dockerfile che utilizzano file diversi dal tuo contesto, COPIAli singolarmente, piuttosto che tutti in una volta. Ciò garantisce che la cache di compilazione di ogni passaggio venga invalidata (forzando la riesecuzione del passaggio) se i file specificatamente richiesti cambiano.

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


sai se possiamo parametrizzare "tutte le cose" ??? Usando i parametri di build? github.com/moby/moby/issues/38532 ???
Marcello de Sales,

@MarcellodeSales non è sicuro del motivo per cui ne avresti bisogno. Perché non crei un'immagine di base senza questi file e quindi le immagini secondarie contengono le istruzioni di copia - se devono comunque definire il percorso non fa molta differenza. Oppure potresti semplicemente lasciarlo fuori dalle immagini e montarlo nel contenitore - lì hai i file .env per avere questo configurabile.
Manuel Manhart,

Inoltre, puoi sempre copiare comunque su un percorso esistente, poiché il file system è a strati, si sovrapporrà / oscurerà il contenuto preesistente.
Manuel Manhart,

@ManuelManhart, sto creando un'immagine con parametri dinamici con ONBUILD COPY ... Come parte di una piattaforma, nascondo la complessità di ciò che deve essere fatto nell'immagine, quindi è per questo che ho bisogno dei valori da fornire come parametro
Marcello de Sales,

@MarcellodeSales Non penso che questo sia supportato proprio ora / ancora. Ma si potrebbe usare argomenti di compilazione di averlo incapsulato, vedere stackoverflow.com/questions/43654656/...
Manuel Manhart

7

semplice

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

dal doc

Se vengono specificate più risorse, direttamente o a causa dell'utilizzo di un carattere jolly, deve essere una directory e deve terminare con una barra /.


6

Vale la pena ricordare che è anche possibile creare un .dockerignorefile, per escludere i file che non si desidera copiare:

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

Prima che la CLI docker invii il contesto al demone docker, cerca un file denominato .dockerignore nella directory principale del contesto. Se questo file esiste, la CLI modifica il contesto per escludere file e directory che corrispondono ai pattern in esso. Questo aiuta a evitare di inviare inutilmente file e directory di grandi dimensioni o sensibili al demone e di aggiungerli potenzialmente alle immagini usando ADD o COPY.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.