Aller au contenu principal

Maîtriser Buildah

Buildah est un outil Open Source en ligne de commande qui permet de créer des images de conteneurs sans avoir besoin d'un démon docker en cours d'exécution. Buildah s'intègre facilement dans des pipelines CI/CD, vous permettant de créer et gérer des images de conteneurs de manière efficace.

Buildah permet de créer des images de conteneurs avec ou sans fichier Dockerfile et à partir d'une image ou from scracth.

Installation de Buildah

Buildah n'est disponible que sur un certain nombre de distributions Linux, mais pas sur les plates-formes Windows ou Mac.

Voici les étapes pour installer Buildah sur Ubuntu :

sudo apt update
sudo apt install buildah

Vérification de l'installation de Buildah

Une fois l'installation terminée, vous pouvez vérifier si Buildah a été installé avec succès en exécutant la commande suivante :

buildah --version
buildah version 1.23.1 (image-spec 1.0.1, runtime-spec 1.0.2-dev)

Vous devriez voir la version de Buildah s'afficher, ce qui indique que l'installation a réussi.

Configuration de Buildah

La variable d'environnement CONTAINER_ROOT définit le chemin où seront stockées les images et les données temporaires. Assurez-vous que cette variable soit correctement configurée pour éviter les problèmes liés au stockage.

Configurer Buildah en mot rootless

Buildah permet de créer des images de conteneurs en tant qu'utilisateur non privilégié, ce qui renforce la sécurité. Pour ce faire, vous devrez configurer les autorisations appropriées. Assurez-vous que votre utilisateur possède les droits nécessaires pour exécuter Buildah. Plus d'infos ici

Construire des images avec Buildah

Dans cette section, vous apprendrez comment créer une image personnalisée à partir de zéro en utilisant Buildah, ainsi qu'à partir d'un classique fichier Dockerfile.

Construction d'une image sans Dockerfile

Attention : Pour ceux qui connaissent docker, vous allez être surpris par ce premier mode de fonctionnement.

La première étape pour construire une image de conteneur est de partir d'une image de base avec la commande from :

buildah from alpine:3.18.4

Cela crée un conteneur Buildah à partir de l'image Alpine Linux. Vous pouvez ensuite personnaliser cet environnement.

Pour obtenir des informations sur le conteneur :

buildah containers
CONTAINER ID  BUILDER  IMAGE ID     IMAGE NAME                       CONTAINER NAME
722d65178ae9     *     8ca4688f4f35 docker.io/library/alpine:3.18.4  alpine-working-container

Lancer des commandes sur un conteneur

Une fois que vous avez un conteneur Buildah, vous pouvez lancer des commandes à l'intérieur du conteneur pour personnaliser l'environnement avec la commande run :

buildah run 722d65178ae9 apk add apache2
fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/community/x86_64/APKINDEX.tar.gz
(1/6) Installing libuuid (2.38.1-r8)
(2/6) Installing apr (1.7.4-r0)
(3/6) Installing libexpat (2.5.0-r1)
(4/6) Installing apr-util (1.6.3-r1)
(5/6) Installing pcre2 (10.42-r1)
(6/6) Installing apache2 (2.4.58-r0)
Executing apache2-2.4.58-r0.pre-install
Executing busybox-1.36.1-r2.trigger
OK: 11 MiB in 21 packages

Le deuxième argument est l'ID du conteneur Buildah que vous avez créé précédemment.

Créer une image à partir d'un conteneur

Une fois que vous avez personnalisé votre conteneur Buildah comme vous le souhaitez, vous pouvez le "commit" pour créer une nouvelle image. Utilisez la commande buildah commit pour créer une image à partir de votre conteneur personnalisé :

buildah commit 722d65178ae9 test:0.1

Pousser une image vers le démon Docker

Si vous souhaitez pousser cette image vers le démon Docker il faut utiliser la commande push :

buildah push test:0.1 docker-daemon:test:0.1
Getting image source signatures
Copying blob cc2447e1835a done
Copying blob b12cf2dd7296 done
Copying config 2b176cc1a4 done
Writing manifest to image destination
Storing signatures

Petite vérification :

docker images
docker images
REPOSITORY              TAG       IMAGE ID       CREATED         SIZE
test                    0.1       2b176cc1a4c2   5 minutes ago   13.1MB

Il existe toute une série de transport autre que docker-daemon:tag :

  • dir
  • containers-storage
  • docker
  • docker-archive
  • oci
  • oci-archive
  • ostree

Regardons docker qui permet de pousser une image vers une registry.

Pousser une image vers une registry de conteneur

Si vous souhaitez pousser cette image vers un registre de conteneurs. Assurez-vous d'être authentifié sur le registre au préalable. Voici comment pousser votre image vers Docker Hub, par exemple :

buildah push test:0.1 docker://mon_utilisateur/test:0.1

Cela pousse l'image vers votre compte Docker Hub. Assurez-vous de remplacer <mon_utilisateur> par votre nom d'utilisateur Docker Hub.

Arrêter un conteneur

Il suffit d'utiliser la commande rm suivi de l'ID du container :

buildah rm 722d65178ae9

Construire des images avec un Dockerfile

Rassurez-vous, on peut aussi construire des images avec un classique Dockerfile. Je vais reprendre le même que celui utilisé avec BuildKit :

FROM alpine:3.18
CMD ["/bin/echo", "Build with Buildah!"]

On peut lancer la construction de l'image avec la commande build :

buildah build -f /tmp/test/Dockerfile -t test:0.3 /tmp/test
[1/2] STEP 1/1: FROM alpine:3.18.4
--> 8ca4688f4f3
[2/2] STEP 1/2: FROM alpine:3.18
Resolved "alpine" as an alias (/etc/containers/registries.conf.d/shortnames.conf)
Trying to pull docker.io/library/alpine:3.18...
Getting image source signatures
Copying blob 96526aa774ef [--------------------------------------] 0.0b / 0.0b
Copying config 8ca4688f4f done
Writing manifest to image destination
Storing signatures
[2/2] STEP 2/2: CMD ["/bin/echo", "Build with Buildah!"]
[2/2] COMMIT test:0.3
Getting image source signatures
Copying blob cc2447e1835a skipped: already exists
Copying blob 5f70bf18a086 done
Copying config 2e05f739c6 done
Writing manifest to image destination
Storing signatures
--> 2e05f739c67
Successfully tagged localhost/test:0.3
2e05f739c674c1050c1700cf9d889b157c79c23c3f2fb4e066e044922c57402b

On vérifie que l'image est bien produite :

buildah images
REPOSITORY                 TAG      IMAGE ID       CREATED          SIZE
localhost/test             0.3      2e05f739c674   27 seconds ago   7.63 MB

On la pousse dans Docker :

buildah push localhost/test:0.3 docker-daemon:test:0.3

Getting image source signatures
Copying blob cc2447e1835a done
Copying blob 5f70bf18a086 done
Copying config 2e05f739c6 done
Writing manifest to image destination
Storing signatures

Un petit contrôle sous Docker :

REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
test                    0.3       2e05f739c674   3 minutes ago    7.34MB
test                    0.1       2b176cc1a4c2   25 minutes ago   13.1MB
alpine                  3.18.4    8ca4688f4f35   4 weeks ago      7.34MB
test                    0.2       db2ff4e626d3   4 weeks ago      7.34MB

Rassurant, on obtient la même taille d'image. On vérifie qu'elle fonctionne ? :

docker run test:0.3
Build with Buildah!

Intégration dans un pipeline CI/CD

Intégrer le processus de construction d'images de conteneurs avec Buildah dans un pipeline CI/CD est le même que celui d'un autre outil.

Par contre, grâce au mode commande de construction d'image, on peut utiliser un script shell plutôt qu'un Dockerfile.

Un exemple :

#!/bin/bash
# Nom du conteneur temporaire
container_name="mon_conteneur_temporaire"
# Créer un conteneur Buildah
container_id=$(buildah from alpine)
# Personnalisation de l'image
buildah run $container_id apk add apache2
# Commit de l'image
buildah commit $container_id mon_image:1.0
# Nettoyage du conteneur temporaire
buildah rm $container_id
# Pousser l'image vers le registre
buildah push mon_image:1.0 docker://mon_utilisateur/mon_image:1.0

Il suffira d'utiliser une image contenant buildah pour l'exécuter par exemple sur Gitlab-CI.

Les avantages de Buildah

Lorsque vous envisagez de choisir un outil pour la construction d'images de conteneurs dans un environnement DevOps, vous vous demandez peut-être pourquoi opter pour Buildah par rapport à Docker. Bien que Docker soit largement utilisé et populaire, Buildah offre plusieurs avantages clés pour les équipes DevOps :

Léger et autonome : Buildah ne nécessite pas un démon Docker en cours d'exécution, ce qui réduit la surcharge système et simplifie l'automatisation. Sécurité renforcée : Vous pouvez exécuter Buildah en tant qu'utilisateur non privilégié, ce qui améliore la sécurité en évitant les vulnérabilités potentielles.

Conclusion

Buildah est donc un outil qui simplifie la construction d'images sans avoir à utiliser le démon Docker et avec un utilisateur sans droits root. Ce billet ne fait que survoler les possibilités offertes par Buildah. Je n'ai par exemple pas évoqué l'utilisation de l'instruction ON_BUILD