Introduzione
Quando crei un Dockerfile, ci sono due comandi che puoi usare per copiare file/directory al suo interno:ADD
e COPY
. Sebbene vi siano lievi differenze nell'ambito della loro funzione, svolgono essenzialmente lo stesso compito.
Allora, perché abbiamo due comandi e come facciamo a sapere quando usare l'uno o l'altro?
In questo articolo spieghiamo ogni comando, analizziamo Docker ADD vs COPY e ti diciamo quale usare.
Comando AGGIUNGI Docker
Iniziamo notando che il ADD
il comando è più vecchio di COPY
. Dal lancio della piattaforma Docker, il ADD
l'istruzione fa parte del suo elenco di comandi.
Il comando copia file/directory in un file system del contenitore specificato.
La sintassi di base per ADD
il comando è:
ADD <src> … <dest>
Include la fonte che desideri copiare (<src>
) seguito dalla destinazione in cui si desidera memorizzarlo (<dest>
). Se l'origine è una directory, ADD
copia tutto al suo interno (inclusi i metadati del file system).
Ad esempio, se il file è disponibile localmente e vuoi aggiungerlo alla directory di un'immagine, digita:
ADD /source/file/path /destination/path
ADD
può anche copiare file da un URL. Può scaricare un file esterno e copiarlo nella destinazione desiderata. Ad esempio:
ADD http://source.file/url /destination/path
Una caratteristica aggiuntiva è che copia i file compressi, estraendo automaticamente il contenuto nella destinazione specificata. Questa funzione si applica solo a file/directory compressi archiviati localmente.
Digita la fonte e dove vuoi che il comando estragga il contenuto come segue:
ADD source.file.tar.gz /temp
Tieni presente che non puoi scaricare ed estrarre un file/directory compresso da un URL. Il comando non decomprime i pacchetti esterni quando li copia nel filesystem locale.
Comando di copia Docker
A causa di alcuni problemi di funzionalità, Docker ha dovuto introdurre un comando aggiuntivo per la duplicazione dei contenuti:COPY
.
A differenza del suo strettamente correlato ADD
comando, COPY
ha solo una funzione assegnata. Il suo ruolo è duplicare file/directory in una posizione specificata nel loro formato esistente. Ciò significa che non si occupa di estrarre un file compresso, ma piuttosto di copiarlo così com'è.
L'istruzione può essere utilizzata solo per i file archiviati localmente. Pertanto, non puoi usarlo con gli URL per copiare file esterni nel tuo contenitore.
Per utilizzare il COPY
istruzioni, segui il formato del comando di base:
COPY <src> … <dest>
Ad esempio:
COPY /source/file/path /destination/path
Copia Docker vs AGGIUNGI
Perché era necessario aggiungere un nuovo comando simile?
Il fatto che ADD
se così tante funzionalità si sono rivelate problematiche nella pratica, poiché si è comportato in modo estremamente imprevedibile. Il risultato di tali prestazioni inaffidabili spesso si riduceva alla copia quando si desidera estrarre e all'estrazione quando si desidera copiare.
Docker non è stato in grado di sostituire completamente il comando a causa dei suoi numerosi usi esistenti. Per evitare la compatibilità con le versioni precedenti, l'opzione più sicura era aggiungere il COPY
comando:un comando meno diversificato ma più affidabile.
Quali utilizzare (migliori pratiche)
Considerando le circostanze in cui il COPY
è stato introdotto il comando, è evidente che mantenere ADD era una questione di necessità. Docker ha rilasciato un documento ufficiale che delinea le migliori pratiche per la scrittura di Dockerfile, che sconsiglia esplicitamente di non usare ADD
comando .
La documentazione ufficiale di Docker rileva che COPY
dovrebbe sempre essere l'istruzione di riferimento in quanto è più trasparente di ADD
.
Se devi copiare dal contesto di compilazione locale in un contenitore, continua a utilizzare COPY
.
Il team Docker sconsiglia inoltre vivamente di utilizzare ADD
per scaricare e copiare un pacchetto da un URL. Invece, è più sicuro ed efficiente usare wget o arricciare all'interno di un RUN
comando. In questo modo eviti di creare un livello immagine aggiuntivo e di risparmiare spazio.
Supponiamo che tu voglia scaricare un pacchetto compresso da un URL, estrarre il contenuto e ripulire l'archivio.
Invece di usare ADD
ed eseguendo il comando seguente:
ADD http://source.file/package.file.tar.gz /temp
RUN tar -xjf /temp/package.file.tar.gz \
&& make -C /tmp/package.file \
&& rm /tmp/ package.file.tar.gz
Dovresti usare:
RUN curl http://source.file/package.file.tar.gz \
| tar -xjC /tmp/ package.file.tar.gz \
&& make -C /tmp/ package.file.tar.gz