C.4 · Construire et distribuer des images
Buildah : construire des images sans Dockerfile ni démon
Leçon théorique · questionnaire de validation · gratuit, dans le navigateur
Construire une image demande-t-il forcément un Dockerfile et un démon ? Non. Buildah construit des images OCI sans démon, sans root si besoin, et de deux façons : à partir d'un Dockerfile, ou commande par commande, dans un script. C'est le moteur de construction qu'utilise podman build, et un outil apprécié dans les pipelines de CI, où l'on ne veut pas de démon Docker privilégié. Cette leçon est théorique : votre machine de lab n'a pas de moteur de conteneurs.
Ce que vous saurez à la fin : construire une image à partir d'un Dockerfile avec Buildah, construire une image pas à pas dans un script, monter le système de fichiers d'une image en construction, et choisir un outil de construction adapté à une CI sur Kubernetes.
1. Avec un Dockerfile
buildah build -t registre.exemple.fr/equipe/api:1.0 . # (ou buildah bud, son ancien nom)
buildah images
buildah push registre.exemple.fr/equipe/api:1.0
Rien de neuf pour l'utilisateur de Docker : c'est ce que fait podman build en coulisse.
2. Pas à pas, dans un script
La vraie particularité de Buildah : chaque instruction d'un Dockerfile devient une commande, qu'on peut enchaîner avec toute la puissance du shell (boucles, conditions, variables).
#!/bin/bash
set -euo pipefail
c=$(buildah from docker.io/library/alpine:3.22) # un conteneur de travail, à partir d'une image
buildah run "$c" -- apk add --no-cache curl # l'équivalent de RUN
buildah copy "$c" ./site /usr/share/site # COPY
buildah config --env MODE=production \
--port 8080 \
--user 1000 \
--entrypoint '["/usr/bin/curl"]' "$c" # ENV, EXPOSE, USER, ENTRYPOINT
buildah commit "$c" registre.exemple.fr/equipe/outil:1.0 # enregistre le résultat comme image
buildah rm "$c"
3. Construire « depuis rien »
c=$(buildah from scratch) # un conteneur vide
m=$(buildah mount "$c") # son système de fichiers, monté sur la machine
cp ./api "$m/api" # on y copie ce qu'on veut, avec les outils de la machine
buildah config --entrypoint '["/api"]' "$c"
buildah umount "$c"
buildah commit "$c" api:1.0
L'image ne contient aucun gestionnaire de paquets ni shell : seulement ce qu'on y a copié. (En mode sans root, buildah mount s'utilise dans buildah unshare.)
4. Construire dans une CI sur Kubernetes
Dans un pipeline qui tourne lui-même dans des pods, donner accès au démon Docker de la machine (socket montée, ou conteneur privileged) revient à donner root sur le nœud. Les outils de construction sans démon évitent ce piège :
| Outil | Particularité |
|---|---|
| Buildah | sans démon, sans root (avec les bons réglages de sécurité), scriptable |
| Kaniko | conçu pour construire dans un pod, sans privilège ; projet aujourd'hui moins activement maintenu |
BuildKit (buildctl, mode rootless) |
le moteur moderne de docker build, utilisable sans Docker |
Quel que soit l'outil, le résultat est une image OCI standard, poussée dans un registre et exécutée par Kubernetes comme n'importe quelle autre.
5. Le trio Podman, Buildah, Skopeo
| Outil | Rôle |
|---|---|
| Podman | exécuter des conteneurs et des pods (leçon C.3) |
| Buildah | construire des images |
| Skopeo | inspecter et copier des images entre registres, sans les télécharger en local (leçon C.5) |
Trois outils spécialisés, sans démon, qui partagent le même stockage d'images (containers/storage) : là où Docker fait tout dans un seul démon.
Validez la leçon avec le questionnaire.