Buildah : Créer des images sans Docker

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.

Qu'est-ce que Buildah ?

Buildah est un outil open-source développé par l'équipe de containers cher 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.

Pourquoi utiliser Buildah ?

  • 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

Comment fonctionne Buildah ?

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

  • Créer un conteneur de travail basé sur une image existante (ex: buildah from ubuntu).
  • Modifier ce conteneur en installant des paquets, copiant des fichiers, configurant des variables d'environnement, etc..., via buildah run, buildah copy, buildah config.
  • Valider et enregistrer ce conteneur sous forme d'image avec buildah commit.
  • 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

💡
Il vous faudra bien-sûr Buildah d'installé

Étape 1 : Préparer la page web

<!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

container=$(buildah from nginx:latest)

Étape 3: Copier la page index.html

buildah copy $container index.html /usr/share/nginx/html/index.html

Étape 4 : Valider et nommer l'image

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

buildah commit $container mon-nginx-buildah:latest

Étape 5 : Tester l'image localement
Si tu as Podman (ou Docker), tu peux lancer ton image :

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

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

Résumé des commandes complètes

# 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

Buildah et Dockerfile : complémentarité

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

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

bud signifie build using Dockerfile

Liste des commandes Buildah

Commande Description
buildah from <image> Crée un conteneur de travail basé sur une image existante ou scratch (vide).
buildah containers Liste les conteneurs de travail créés avec Buildah.
buildah images Liste 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 version Affiche la version de Buildah installée.

Aller plus loin

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