Skip to content
Logo
GitHubLinkedIn

Buildah : Créer des images sans Docker

Le monde des conteneurs évolue rapidement, tout comme les outils permettant de créer, gérer et déployer des images. Docker a longtemps été l’outil dominant, un réel couteau suisse, mais d’autres solutions, parfois plus légères ou axées sur la sécurité commencent à se faire une place. Buildah en fait partie. Cet article propose une présentation de Buildah : ce que c’est, ce qu’il apporte, comment ça fonctionne, et comment l’utiliser concrètement.

Buildah est un outil open-source développé par l’équipe de containers chez Red Hat, conçu pour créer et gérer des images de conteneurs au format OCI (Open Container Initiative). Il fait partie de l’écosystème de conteneur en parallèle de Podman, CRI-O et Skopeo.

À la différence de Docker, Buildah ne nécessite pas l’utilisation d’un démon (daemon) en arrière-plan. Cela signifie qu’il s’exécute de manière plus légère, sans un processus persistant, ce qui réduit la surface d’attaque et simplifie la gestion.

Buildah permet de créer des images de conteneurs de manière impérative (commande par commande) ou déclarative (via des Dockerfiles), avec une compatibilité complète. Il s’intègre ainsi parfaitement dans des pipelines CI/CD modernes, offrant une grande flexibilité pour automatiser la création d’images.

  • Outil sans démon, plus sécurisé
  • Fonctionnement en mode rootless (peut tourner sans privilèges root)
  • Compatible avec OCI et Docker
  • Intégration facile dans les pipelines
  • Contrôle fin sur la construction

Buildah fonctionne autour du concept de conteneurs temporaires pour construire des images. Voici les grandes étapes typiques :

  1. Créer un conteneur de travail basé sur une image existante (ex: buildah from ubuntu)
  2. Modifier ce conteneur en installant des paquets, copiant des fichiers, configurant des variables d’environnement, etc., via buildah run, buildah copy, buildah config
  3. Valider et enregistrer ce conteneur sous forme d’image avec buildah commit
  4. Pousser l’image sur un registre (Docker Hub, Quay, GHCR, …) avec buildah push

Chaque commande agit directement sur un conteneur temporaire, qui n’est pas forcément lancé comme un conteneur classique mais sert d’espace de travail pour préparer l’image.

Exemple pas à pas : créer une image simple

Section titled “Exemple pas à pas : créer une image simple”

Note: Il vous faudra bien-sûr Buildah d’installé

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<title>Ma page avec Buildah</title>
</head>
<body>
<h1>Bienvenue sur mon site servi par Nginx + Buildah !</h1>
<p>Ceci est une page statique.</p>
</body>
</html>

Ici, on crée une page HTML simple, index.html

Étape 2 : Créer un conteneur basé sur l’image officielle Nginx

Section titled “Étape 2 : Créer un conteneur basé sur l’image officielle Nginx”
Terminal window
container=$(buildah from nginx:latest)
Terminal window
buildah copy $container index.html /usr/share/nginx/html/index.html

Par défaut, l’image de Nginx possède déjà un point d’entrée CMD qui lance le serveur Nginx, donc pas besoin de le redéfinir.

Terminal window
buildah commit $container mon-nginx-buildah:latest

Si tu as Podman (ou Docker), tu peux lancer ton image :

Terminal window
podman run -d -p 8080:80 mon-nginx-buildah:latest

Puis dans ton navigateur ouvre : http://localhost:8080

Terminal window
# Préparation
container=$(buildah from nginx:latest)
# Copier la page web
buildah copy $container index.html /usr/share/nginx/html/index.html
# Valider l'image
buildah commit $container mon-nginx-buildah:latest

Si vous avez déjà des Dockerfiles, vous pouvez utiliser Buildah pour les construire via :

Terminal window
buildah bud -f Dockerfile -t mon-image:latest .

bud signifie build using Dockerfile

CommandeDescription
buildah from <image>Crée un conteneur de travail basé sur une image existante ou scratch (vide)
buildah containersListe les conteneurs de travail créés avec Buildah
buildah imagesListe les images présentes localement
buildah run <container> -- <cmd>Exécute une commande à l’intérieur d’un conteneur de travail. Le -- sépare les options de Buildah de la commande exécutée dans le conteneur
buildah copy <container> <src> <dst>Copie un fichier ou dossier de l’hôte vers le conteneur
buildah add <container> <src> <dst>Copie un fichier/dossier ou télécharge depuis une URL vers le conteneur
buildah config [options] <container>Configure des paramètres du conteneur (CMD, ENV, ENTRYPOINT, USER, WORKDIR, etc.)
buildah commit <container> <image>Sauvegarde un conteneur de travail sous forme d’image
buildah push <image> <dest>Pousse une image vers un registre (Docker Hub, Quay, etc.)
buildah pull <image>Télécharge une image depuis un registre
buildah bud -f Dockerfile -t <image> <dir>Construit une image à partir d’un Dockerfile
buildah tag <image> <nouveau_tag>Ajoute un nouveau tag à une image existante
buildah rmi <image>Supprime une image locale
buildah rm <container>Supprime un conteneur de travail
buildah mount <container>Monte un conteneur sur le système de fichiers hôte pour y accéder directement
buildah umount <container>Démonte un conteneur précédemment monté
buildah inspect <objet>Affiche les détails d’un conteneur ou d’une image
buildah login <registry>Se connecter à un registre de conteneurs
buildah logout <registry>Se déconnecter d’un registre
buildah versionAffiche la version de Buildah installée

Si vous souhaitez aller plus loin, je vous invite à consulter les tutoriels de buildah en ligne ici : https://github.com/containers/buildah/tree/main/docs/tutorials