Sobes.tech
Middle

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:

  • COPY copia semplicemente file e directory dalla sorgente specificata sull'host alla destinazione nel container. La sorgente deve essere un file o directory locale.
  • ADD ha capacità più ampie: può copiare file e directory locali, estrarre archivi (tar, gzip, bzip2) e scaricare file da URL.

Best practice:

  1. Preferisci COPY invece di ADD: nella maggior parte dei casi, COPY è sufficiente. È più trasparente, poiché copia semplicemente file locali. Usare ADD per estrarre archivi o scaricare da URL può essere meno prevedibile e aumentare la complessità della build.

  2. Usa COPY per i file locali: se devi copiare file dal contesto di build nell'immagine, usa sempre COPY.

    # Invece di ADD . /app
    COPY . /app 
    
  3. Fai attenzione agli URL in ADD: l'uso di ADD con 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 usare curl o wget in 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
    
  4. Estrai gli archivi in uno strato separato quando usi ADD: se devi usare ADD per estrarre un archivio (scenario meno comune), assicurati di farlo in uno strato separato. Tuttavia, come menzionato prima, di solito è meglio estrarre esplicitamente con RUN.

  5. 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 .dockerignore per 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
    
  6. 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
    
  7. Varia l'ordine in base alla frequenza di modifica: posiziona le istruzioni COPY o ADD per i file che cambiano meno frequentemente (ad esempio, file di dipendenze come package.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.