Comment effectuer du build multi-stage avec Docker ?
Le principe
Le build multi-stage de Docker est une fonctionnalité qui permet de créer des images Docker plus légères et permettant d'effectuer des tests unitaires plus fins en utilisant plusieurs étapes de build.
C'est une fonctionnalité qui permet de construire une image Docker à partir de plusieurs autres images. Chacune des étapes utilise un conteneur Docker séparé. Cela peut s'avérer très utile lorsque l'on a besoin de dépendances tierces pour l'installation d'un composant, mais que ces dépendances sont inutiles dans l'image finale.
Chaque étape décrite dans le Dockerfile
peut utiliser des outils différents et uniquement copier les fichiers dont on a besoin dans l'étape suivante, ce qui permet d'éviter d'inclure des fichiers inutiles dans l'image finale.
Par exemple, on peut utiliser une première étape pour compiler du code source, puis une seconde étape pour copier les fichiers compilés et les dépendances.
Exemple
Pour utiliser le build multi-stage, il suffit de définir plusieurs étapes dans le fichier Dockerfile
en utilisant la directive FROM
plusieurs fois. Par exemple :
# Etape 1 : Compilation
FROM golang:latest AS builder
# Copier les fichiers sources
COPY . /app
# Se rendre dans le répertoire contenant les fichiers sources
WORKDIR /app
# Compiler l'application
RUN go build -o app
# Etape 2 : Création de l'image finale
FROM alpine:latest
# Copier les fichiers compilés de l'étape 1
COPY --from=builder /app/app /app/
# Exécuter l'application
CMD ["/app/app"]
Avec cet exemple, on utilise une première étape pour compiler l'application en utilisant l'image golang:latest
, puis on crée une seconde étape pour copier les fichiers compilés dans une image alpine:latest
plus légère.
Conclusion
Le build multi-stage de Docker est donc une fonctionnalité très utile pour créer des images Docker plus légères et plus sécurisées. Il est facile à utiliser et peut s'avérer très utile pour améliorer les performances et la sécurité de vos applications Docker.
Cela permet d'obtenir des images Docker plus petites et plus faciles à gérer, et de mieux contrôler les fichiers inclus dans l'image finale pour des raisons de sécurité.