Quali sono le migliori pratiche per usare le istruzioni ADD e COPY in Docker?
sobes.tech AI
Risposta dell'AI
Esistono diverse best practice per le istruzioni ADD e COPY in Docker, volte a migliorare la sicurezza, la trasparenza e l'efficienza nella creazione delle immagini.
La principale differenza tra ADD e COPY:
COPYcopia semplicemente file e directory dalla sorgente specificata sull'host alla destinazione nel container. La sorgente deve essere un file o directory locale.ADDha capacità più ampie: può copiare file e directory locali, estrarre archivi (tar, gzip, bzip2) e scaricare file da URL.
Best practice:
-
Preferisci
COPYinvece diADD: nella maggior parte dei casi,COPYè sufficiente. È più trasparente, poiché copia semplicemente file locali. UsareADDper estrarre archivi o scaricare da URL può essere meno prevedibile e aumentare la complessità della build. -
Usa
COPYper i file locali: se devi copiare file dal contesto di build nell'immagine, usa sempreCOPY.# Invece di ADD . /app COPY . /app -
Fai attenzione agli URL in
ADD: l'uso diADDcon URL può portare a instabilità nella build se la risorsa remota non è disponibile. Inoltre, può essere meno sicuro, poiché dipende da una fonte esterna. È preferibile usarecurlowgetin uno strato separato (RUN) per scaricare risorse da URL, dando più controllo e permettendo di verificare le somme di controllo.# Invece di ADD http://example.com/file.tar.gz /tmp/ RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* \ && curl -fsSL http://example.com/file.tar.gz -o /tmp/file.tar.gz \ && tar -xzf /tmp/file.tar.gz -C /app \ && rm /tmp/file.tar.gz -
Estrai gli archivi in uno strato separato quando usi
ADD: se devi usareADDper estrarre un archivio (scenario meno comune), assicurati di farlo in uno strato separato. Tuttavia, come menzionato prima, di solito è meglio estrarre esplicitamente conRUN. -
Copia solo i file necessari: non copiare tutto il contesto di build (
COPY . /app) se contiene file non necessari (codice sorgente, dati di test, directory nascoste, ecc.). Usa.dockerignoreper escludere questi file. Questo riduce la dimensione dell'immagine e accelera la build riducendo i dati trasferiti al demone Docker.Esempio di
.dockerignore:.git node_modules *.log tmp/# Copia solo i file necessari dopo aver applicato `.dockerignore` COPY . /app -
Usa percorsi assoluti per le destinazioni: indica sempre percorsi assoluti nell'immagine (/app, /usr/local/bin, ecc.). Questo rende il Dockerfile più comprensibile e prevedibile, evitando incertezze riguardo alla directory di lavoro corrente (
WORKDIR).# Usa sempre percorsi assoluti per le destinazioni COPY src /app/src -
Varia l'ordine in base alla frequenza di modifica: posiziona le istruzioni
COPYoADDper i file che cambiano meno frequentemente (ad esempio, file di dipendenze comepackage.json,requirements.txt) più in alto nel Dockerfile, e quelle per i file che cambiano più frequentemente (codice sorgente dell'applicazione) più in basso. Questo permette a Docker di sfruttare efficacemente la cache dei layer.# File di dipendenze (cambiano meno) COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Codice sorgente dell'applicazione (cambia più spesso) COPY . /app/
Tabella riassuntiva:
| Istruzione | Descrizione | Uso raccomandato | Cosa evitare |
|---|---|---|---|
COPY |
Copia file/directory locali | Copia di file e directory locali nell'immagine. | Usare se si necessita di estrarre archivi o scaricare da URL. |
ADD |
Copia file/directory locali, estrae archivi, scarica da URL | Uso per estrazioni automatiche di archivi (raro). | Usare per copiare file locali (preferire COPY). Usare per scaricare da URL. |
Seguendo queste pratiche si ottengono immagini Docker più affidabili, sicure ed efficienti.