Un’immagine Docker compatta, veloce ed efficace.

Spread the love
immagine docker - Dockerfile
docker – Dockerfile

Ho fatto una sintesi delle strategie per ottimizzare una immagine Docker. Di seguito trovate le considerazioni per rendere più efficiente la costruzione delle immagini.


Come ridurre la dimensione delle immagini Docker e migliorare i tempi di build

Ottimizzare una immagine Docker è essenziale per ridurre i tempi di build, migliorare l’efficienza e risparmiare spazio su disco. Le immagini più piccole sono più rapide da scaricare e distribuire, facilitando il deployment nei vari ambienti. In questo articolo ti spiegherò alcune strategie efficaci per ottenere immagini Docker più leggere e migliorare le performance di build.

1. Eliminare la documentazione dei software

Nei container Docker, la documentazione (come manuali o pagine man) raramente è necessaria. Se hai bisogno di consultare la documentazione, puoi farlo direttamente online, quindi non ha senso mantenerla all’interno delle immagini. Rimuovere la documentazione può liberare un discreto quantitativo di spazio.

Come farlo:

Puoi configurare apt per evitare di installare la documentazione. Ad esempio:

RUN apt-get install -y --no-install-recommends gnupg2 ca-certificates
RUN echo 'path-exclude=/usr/share/doc/*' > /etc/dpkg/dpkg.cfg.d/01_nodoc && \
    echo 'path-exclude=/usr/share/man/*' >> /etc/dpkg/dpkg.cfg.d/01_nodoc && \
    echo 'path-exclude=/usr/share/info/*' >> /etc/dpkg/dpkg.cfg.d/01_nodoc

Con questa configurazione, non verranno installati manuali, pagine man o altra documentazione inutile.

2. Evitare ripetizioni inutili di apt update

Quando esegui apt update, Docker scarica l’elenco aggiornato dei pacchetti dai repository. Tuttavia, eseguire più volte questo comando senza un motivo valido non solo rallenta la build, ma aumenta inutilmente la dimensione dell’immagine.

Inoltre può essere utile raggruppare il più possibile in una sola istruzione multiriga molte istruzioni Docker perché ad ogni riga viene aggiunto un layer.

Quando eseguire apt update:

  • Necessario: Prima di eseguire un’installazione (apt install) o subito dopo aver aggiunto un repository con add-apt-repository. Ogni volta che aggiungi nuovi repository, è importante aggiornare l’elenco dei pacchetti per includere le nuove fonti.
  • Non necessario: Se hai già eseguito apt update e devi solo installare nuovi pacchetti in momenti diversi. Non è necessario ripetere l’aggiornamento finché i repository non cambiano.

3. Cosa sono i layer in Docker?

Le immagini Docker sono costituite da una serie di layer impilati uno sopra l’altro. Ogni istruzione in un Dockerfile (come RUN, COPY, ADD) crea un nuovo layer. Questi layer sono immutabili e vengono memorizzati nella cache. I layer inferiori rappresentano l’immagine base, mentre quelli superiori contengono le modifiche. Ridurre il numero di layer e ottimizzarli aiuta a migliorare i tempi di build e a ridurre la dimensione dell’immagine.

Ad esempio raggruppare queste tre istruzioni

RUN apt update 
RUN apt install -y
RUN build-essential
RUN procps
RUN systemd

in una sola riga

RUN apt update && apt install -y \
    build-essential \
    procps \
    systemd \

consnte di aggiungere un solo layer anziché 4 migliorando la performance di build.

4. Pulire i file temporanei e la cache di apt

Una volta che hai installato tutto il necessario, puoi ridurre ulteriormente la dimensione della tua immagine Docker rimuovendo i file temporanei e la cache di apt. Questo passaggio aiuta a ridurre la dimensione del layer finale del container.

Comando da eseguire:

RUN apt clean && rm -rf /var/lib/apt/lists/*

Questo comando rimuove la cache di apt, che non è più necessaria una volta che i pacchetti sono stati installati. La cache può occupare una quantità significativa di spazio e non ha utilità all’interno del container.

5. Multi-stage build: attenzione agli aggiornamenti tra gli stage

Se stai usando una multi-stage build, dove hai più istruzioni FROM nel tuo Dockerfile, è importante ricordare che ogni FROM avvia un nuovo stage completamente separato. Se esegui comandi di installazione di pacchetti in più stage, dovrai eseguire apt update in ciascuno di essi.

Esempio:

FROM ubuntu:22.04 AS base
RUN apt update && apt install -y curl

FROM ubuntu:22.04 AS final
RUN apt update && apt install -y nginx

Ogni volta che utilizzi FROM, inizia un nuovo contesto, quindi dovrai aggiornare i pacchetti separatamente.

6. Evitare di copiare file non necessari

Un’altra pratica comune che può ridurre la dimensione dell’immagine è l’uso del file .dockerignore per evitare di copiare file inutili nel container. File come .git, documentazione o altri file non essenziali possono essere esclusi.

Esempio di .dockerignore:

.git
*.md

In questo modo, Docker ignorerà questi file durante il build.

Conclusione

Seguendo queste best practice, puoi migliorare significativamente la velocità di build e ridurre la dimensione delle immagini Docker. Ecco un riepilogo delle strategie:

  • Eliminare la documentazione dei software: Imposta apt per non scaricare documenti e pagine man.
  • Non ripetere apt update inutilmente: Fai apt update solo quando necessario.
  • Pulizia della cache: Usa apt clean e rimuovi i file temporanei per minimizzare lo spazio occupato.
  • Multi-stage build: Ricorda che ogni FROM richiede un aggiornamento separato.
  • Usa .dockerignore: Escludi file non necessari durante il build.

Con queste tecniche, puoi ottenere immagini Docker più piccole, più efficienti e più veloci da costruire.


Riferimenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.