GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Qual è la differenza tra COPIA e AGGIUNGI in Dockerfiles?

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.


Docker
  1. Qual è la differenza tra InnoDB e MyISAM?

  2. Qual è la differenza tra strtok_r e strtok_s in C?

  3. Qual è la differenza tra fsck ed e2fsck?

  4. Qual è la differenza tra ls e l?

  5. Qual è la differenza tra $(CC) e $CC?

Qual è la differenza tra Cat e Touch Command

Qual è la differenza tra Login e Non-Login Shell

Qual è la differenza tra il comando apt e apt-get?

Qual è la differenza tra le istruzioni COPIA e AGGIUNGI in Dockerfile?

Che cos'è un hypervisor? Qual è la differenza tra il tipo 1 e 2?

Qual è la differenza tra curl e Wget?