Leçon 21 : Dockerfile Avancé : Constructions Multi-Étapes (Multi-Stage Builds)
Un problème courant est que la compilation de code (par exemple, Java, Go, React) nécessite de grandes images d'outillage (SDKs, compilateurs, paquets npm), mais ces outils ne sont pas nécessaires dans l'environnement d'exécution final.
Le Problème : Images Gonflées (Bloated Images)
Si vous compilez une application Go dans une image Go standard, l'image finale résultante inclura l'ensemble de la chaîne d'outils du compilateur et les dépendances, rendant l'image inutilement volumineuse.
La Solution : Les Constructions Multi-Étapes (Multi-Stage Builds)
Les constructions multi-étapes vous permettent de définir plusieurs instructions FROM dans un seul Dockerfile. Vous copiez uniquement les artefacts nécessaires (le binaire compilé ou les fichiers statiques finaux) de l'étape 'builder' vers l'étape finale 'runtime' légère.
Exemple : Construction d'une Application Go
dockerfile
--- ÉTAPE 1 : Étape de Construction (Builder Stage) ---
FROM golang:1.21-alpine AS builder
WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . .
Compiler le binaire statique
RUN CGO_ENABLED=0 go build -o /app/my_app .
--- ÉTAPE 2 : Étape d'Exécution Finale (Runtime Stage) ---
Utiliser une image minimale (alpine) qui n'inclut pas le compilateur
FROM alpine:latest
WORKDIR /root/
Copier uniquement le binaire compilé à partir de l'étape 'builder'
COPY --from=builder /app/my_app .
Définir la commande exécutable finale
CMD ["./my_app"]
Avantages :
- Images Plus Petites : L'image finale est considérablement plus petite car elle ne contient que l'exécutable et les bibliothèques OS nécessaires.
- Sécurité Améliorée : Moins de surface d'attaque car les outils de développement sont absents de l'image de production.