Sobes.tech
Middle

Dans quels cas utilise-t-on une compilation multi-étapes ?

sobes.tech IA

Réponse de l'IA

La construction multi-étapes (multi-stage build) dans Docker est utilisée dans les cas suivants :

  1. Réduction de la taille de l’image finale : La première (ou intermédiaire) couche de construction contient les outils nécessaires pour compiler, tester ou d’autres étapes de construction (par exemple, compilateur, dépendances de construction). La deuxième (finale) couche ne copie que les artefacts nécessaires pour exécuter l’application (code compilé, fichiers exécutables, bibliothèques d’exécution). Cela évite d’inclure dans l’image finale des dépendances et outils de construction inutiles, réduisant ainsi sa taille.
  2. Séparation des étapes de construction et d’exécution : La séparation claire facilite la compréhension du processus de construction et son débogage. On peut avoir des étapes pour compiler le code source, exécuter des tests, faire du linting, puis créer l’image finale avec l’application prête à déployer.
  3. Amélioration de la sécurité : L’image finale contient le minimum nécessaire de composants, ce qui réduit la surface d’attaque. Les outils de construction et le code source, qui pourraient contenir des vulnérabilités, ne sont pas inclus dans l’image utilisée en production.
  4. Accélération de la construction (dans certains cas) : Les images intermédiaires peuvent être mises en cache, et en ne modifiant que les dernières étapes de construction, il n’est pas nécessaire de tout reconstruire à partir de zéro.
  5. Unification du processus de construction : La construction de l’application et la création de son image Docker deviennent un processus automatisé unique dans un Dockerfile, ce qui simplifie les pipelines CI/CD.

Exemple d’utilisation pour une application en Go :

# Étape de construction
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
# Compilation du fichier exécutable
RUN go build -ldflags="-s -w" -o myapp .

# Étape finale
FROM alpine:latest
WORKDIR /app
# Copions uniquement le fichier exécutable de l’étape précédente
COPY --from=builder /app/myapp .
# Spécifions la commande pour lancer l’application
CMD ["./myapp"]