Ho fatto una sintesi delle strategie per ottimizzare una immagine Docker. Di seguito trovate le considerazioni per rendere più efficiente la costruzione delle immagini.
Sommario
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 conadd-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: Faiapt 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.
Commenti recenti