ADD
e COPY
sono due simili Dockerfile
istruzioni che ti consentono di aggiungere contenuto alle tue immagini in fase di creazione. Mentre COPY
è una semplice copia da sorgente a destinazione, ADD
include funzionalità extra per lavorare con archivi e URL remoti.
COPIA
COPY
è la più semplice delle due istruzioni. Accetta due argomenti, una sorgente e una destinazione:
COPY example.txt /example/dir/example.txt
Il percorso di origine verrà copiato dal tuo host Docker nel filesystem del contenitore. L'immagine creata includerà il file o la directory copiati nel percorso di destinazione specificato.
COPY
funziona con tutti i file e le directory, ma i percorsi di origine sono limitati a quelli all'interno del tuo contesto di compilazione attivo. Il contesto viene impostato quando esegui docker build
:
docker build . # OR docker build /path/to/context
L'istruzione crea automaticamente la directory di destinazione nel contenitore quando non esiste già. Se includi una barra finale (/
), Docker tratta la destinazione come una directory e inserisce il file di origine al suo interno.
Puoi utilizzare caratteri jolly come *.jpg
nella destinazione del percorso di origine in modo che corrisponda a un set di file. Queste espressioni verranno analizzate utilizzando Go filepath
corrispondenza.
I file copiati hanno un UID e un GID pari a 0 per impostazione predefinita. Questo può essere personalizzato con il --chown
opzionale flag che accetta UID, GID e nomi. Esegue chown
sui file copiati una volta che sono all'interno del contenitore:
COPY --chown=my-user:my-group example.txt /example.txt
COPY
supporta anche un --from
bandiera. Questo modifica il percorso di origine per fare riferimento a un altro immagine del contenitore, invece del tuo contesto di compilazione locale. Funziona anche con build multifase per inserire artefatti creati da fasi di build precedenti.
# 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
Il --from
flag deve fare riferimento a una fase denominata elencata in precedenza in Dockerfile
. Quando non c'è una fase corrispondente, Docker presume che tu stia facendo riferimento a un'immagine. Verrà visualizzato un errore di compilazione se non è possibile estrarre l'immagine.
AGGIUNGI
ADD
ha la stessa sintassi di COPY
, accettando percorsi di origine e di destinazione. Non c'è supporto per --from
ma puoi usare --chown
.
A differenza di COPY
, ADD
è in grado di scaricare URL di file remoti. Specificando un URL accessibile pubblicamente come percorso di origine, il file verrà scaricato e lo verrà aggiunto all'immagine del contenitore. L'ora modificata del percorso di destinazione (mtime
) verrà impostato sul valore di Last-Modified
header nella risposta HTTP del download.
ADD
può anche estrarre archivi tar, inclusi archivi compressi con gzip, bzip2 e xz. Specificando un archivio compatibile come percorso di origine, il suo contenuto verrà decompresso nella directory del contenitore specificata. I contenuti esistenti della directory verranno mantenuti.
Il rilevamento dell'archivio si basa sul contenuto effettivo del file, non sul nome del file o sull'estensione. Puoi utilizzare qualsiasi file di archivio originale senza nominarlo .tar
, .tar.gz
o .tar.xz
.
La possibilità di estrarre automaticamente gli archivi semplifica l'aggiunta di pacchetti software distribuiti come file tar alle immagini del contenitore. Fornire un percorso tar a COPY
copierebbe il file di archivio compresso così com'è, non il suo contenuto. Dovresti usare un RUN
istruzioni per decomprimere manualmente il file.
I comportamenti relativi a COPY
applica a ADD
a. Fatta eccezione per gli URL remoti, i percorsi di origine devono esistere nel contesto di compilazione. Il percorso di destinazione del contenitore verrà creato automaticamente quando non esiste utilizzando le regole di Docker per la risoluzione del percorso.
Riepilogo
COPY
e ADD
sono due istruzioni strettamente correlate ma nettamente diverse che puoi usare quando scrivi un Dockerfile
. Poiché i loro set di funzionalità si sovrappongono, ti starai chiedendo quale sia il "migliore" da utilizzare per impostazione predefinita.
Secondo la guida alle migliori pratiche di Docker, dovresti raggiungere COPY
a meno che tu non abbia bisogno delle funzionalità extra di ADD
. ADD
è un'operazione opaca che aggiunge magia al processo di copia.
Solo utilizzando ADD
quando è effettivamente necessario aiuta a comunicare le tue intenzioni. In caso contrario, rischi che i membri del team prendano l'abitudine di utilizzare ADD
che potrebbe avere conseguenze disastrose. Un ADD my-archive.tar .
non intenzionale invece di COPY my-archive.tar
potrebbe causare confusione e build interrotte quando i contenuti dell'archivio vengono visualizzati nel tuo contenitore, anziché nell'archivio stesso.
Dovresti anche considerare attentamente quando è opportuno utilizzare ADD
con URL remoti. Può essere più efficiente usare curl
o wget
con un RUN
istruzioni in quanto ciò aiuta a facilitare la memorizzazione nella cache del livello dell'immagine. Un ADD
l'istruzione invaliderà sempre la cache per tutte le fasi di compilazione successive quando il file in un URL remoto cambia.
Ove possibile, è buona norma eliminare i file copiati dopo che sono stati utilizzati. Se stai scaricando o estraendo un programma di installazione del software, eliminare il binario una tantum dopo averlo eseguito ti aiuterà a snellire la tua immagine finale.