Docker Multi-Stage Build: Una Guida Approfondita

Introduzione
Docker ha rivoluzionato il modo in cui sviluppiamo, pacchettizziamo e distribuiamo le applicazioni. Fornisce un ambiente coerente per l'esecuzione delle applicazioni, dallo sviluppo alla produzione, riducendo il problema del "funziona sulla mia macchina". Una delle funzionalità più potenti introdotte da Docker sono le multi-stage build. Questa funzionalità ci aiuta a creare container snelli ed efficienti senza il solito fastidio. In questo blog post, approfondiremo le multi-stage build di Docker, i loro vantaggi e le migliori pratiche. Forniremo anche un Dockerfile di esempio per illustrare il concetto.
Cosa Sono le Docker Multi-Stage Build?
Le Docker multi-stage build sono una funzionalità che ti permette di utilizzare più istruzioni FROM nel tuo Dockerfile. Ogni istruzione FROM può utilizzare un'immagine base diversa e inizia una nuova fase della build. Puoi copiare selettivamente gli artefatti da una fase all'altra, lasciando indietro tutto ciò che non ti serve nell'immagine finale. Questo ti permette di creare immagini più piccole ed efficienti separando i processi di building e packaging in diverse fasi.
Perché Usare le Docker Multi-Stage Build?
Prima dell'introduzione delle multi-stage build, creare immagini Docker snelle era un po' una seccatura. Dovevi creare Dockerfile separati per building ed esecuzione delle applicazioni, o installare strumenti non necessari nelle immagini di produzione. Le multi-stage build risolvono questi problemi permettendoti di usare un solo Dockerfile per creare immagini efficienti. Ecco alcuni motivi per cui dovresti usare le Docker multi-stage build:
- Dimensione dell'Immagine Ridotta: Copiando solo i file necessari dalla fase di build all'immagine finale, puoi ridurre significativamente la dimensione delle tue immagini Docker. Immagini più piccole sono più veloci da pushare e pullare dai registry e usano meno spazio su disco.
- Separazione delle Responsabilità: Con le multi-stage build, puoi separare le dipendenze di build-time da quelle di runtime. Questo rende il tuo Dockerfile più facile da leggere e mantenere.
- Sicurezza: Immagini più piccole hanno una superficie di attacco ridotta. Escludendo strumenti e file non necessari, riduci il potenziale di vulnerabilità di sicurezza.
Migliori Pratiche
- Usa Immagini Base Specifiche: Per ogni fase, usa l'immagine base più specifica che include solo ciò di cui hai bisogno per quella fase. Ad esempio, usa un'immagine Node.js per una fase di build che coinvolge un'applicazione Node.js e un'immagine Alpine per una fase finale leggera.
- Ottimizza la Creazione dei Layer: Docker costruisce le immagini a layer. Per rendere le build più veloci e le immagini più piccole, cerca di minimizzare il numero di layer combinando i comandi con
&&. - Pulisci Dopo Te Stesso: Nella fase di build, pulisci i file e gli artefatti non necessari dopo averli usati. Questo renderà la cache di build più piccola e veloce.
Dockerfile di Esempio
Ecco un Dockerfile di esempio che mostra una multi-stage build per un'applicazione Node.js:
Dockerfile
—- Base Node —-
FROM node:14 AS base
WORKDIR /usr/src/app
COPY package*.json ./
—- Dependencies —-
FROM base AS dependencies
RUN npm install
—- Test —-
esegue linter, setup e test
FROM dependencies AS test
COPY . .
RUN npm run test
—- Build —-
FROM dependencies AS build
COPY . .
RUN npm run build
—- Release —-
FROM node:14-alpine AS release
WORKDIR /usr/src/app
COPY –from=build /usr/src/app/dist ./dist
EXPOSE 8080
CMD [“node”, “dist/index.js”]
In questo Dockerfile, abbiamo cinque fasi: base, dependencies, test, build e release. La fase base copia i file package.json. La fase dependencies installa i moduli Node. La fase test esegue i test. La fase build compila l'applicazione. Infine, la fase release crea l'immagine finale che sarà usata in produzione. Solo i file necessari vengono copiati nell'immagine finale, risultando in un'immagine più piccola ed efficiente.
Conclusione
Le Docker multi-stage build sono uno strumento potente per creare immagini Docker efficienti. Ti permettono di separare gli ambienti di build e runtime, ridurre le dimensioni dell'immagine e migliorare la sicurezza. Seguendo le migliori pratiche e utilizzando un Dockerfile ben strutturato, puoi sfruttare appieno questa funzionalità. Buon Dockering!
Altro da Ercan
Altri due siti, stesso autore, terreno diverso.
IA, LLMs, agenti, ML applicato.
Note sul campo su workload IA. Analisi dei costi Bedrock, pattern di agenti, trade-off di storage vettoriale, failure mode in produzione.
Visita ercan.ai →L'hub. Chi sono, consulenza, contatti.
Hub personale per entrambe le tracce di scrittura. Chi sono, come funziona la consulenza, come contattarmi.
Visita ercanermis.com →