Construire une image avec Docker BuildX

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 install

Listez ensuite les instances de build Docker disponible avec cette commande :

docker buildx ls
Voici un exemple de retour :
NAME/NODE     DRIVER/ENDPOINT   STATUS    BUILDKIT   PLATFORMS
default*      docker                                 
 \_ default    \_ default       running   v0.25.1    linux/amd64 (+3), linux/386

Un 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 --use

Build

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