Construire une image avec Docker BuildX
Docker BuildX est un plugin de Docker (installé par défaut) qui permet de construire et déployer des images Docker sur différentes architectures, comme x86 ou ARM. Pratique lorsque vous souhaitez déployer votre projet sur votre Raspberry PI ou encore sur les derniers macOS ARM !
Mise en place du contexte
Assurez-vous d'avoir le plugin Docker Buildx d'installé en exécutant cette commande :
docker buildx installListez ensuite les instances de build Docker disponible avec cette commande :
docker buildx lsVoici un exemple de retour :
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default* docker
\_ default \_ default running v0.25.1 linux/amd64 (+3), linux/386Un builder est un contexte de build BuildKit. Vous pouvez en créer un dédié avec le driver docker-container (performant et isolé).
docker buildx create --name mybuilder --driver docker-container --useBuild
A la manière de la commande docker build, nous allons construire une nouvelle image avec la commande docker buildx build. Il faut que celle-ci soit disponible en local (lorsque l'on exécute docker images) :
docker buildx build -t MON_IMAGE_DOCKER:MON_TAG --load .Multi-Build
Il y a une autre fonctionnalité encore plus puissante qui permet de construire une image Docker sur plusieurs architectures simultanément et de la pousser en une seule commande !
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t MY_REGISTRY/monorg/monapp:1.0.0 \
-t MY_REGISTRY/monorg/monapp:latest \
--push .Cette fonctionnalité est idéale pour vos pipelines CI/CD pour gagner en temps et étapes.
Bake
Il est aussi possible de Build une image Docker à partir d'un fichier nommé docker-bake.hcl qui ressemble à ceci :
group "default" {
targets = ["app"]
}
target "common" {
platforms = ["linux/amd64","linux/arm64"]
cache-from = ["type=registry,ref=monrepo/app:buildcache"]
cache-to = ["type=registry,ref=monrepo/app:buildcache,mode=max"]
}
target "app" {
inherits = ["common"]
context = "."
dockerfile = "Dockerfile"
tags = ["monrepo/app:latest"]
output = ["type=registry"]
}Vous avez reconnu la ressemble avec la syntaxe Terraform non ? Il s'agit ici de la même base.
Pour appliquer ensuite les changements à partir de ce fichier, exécuter la commande suivante :
docker buildx bake