Maîtriser Buildah
Mise à jour :
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 updatesudo 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 --versionbuildah 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 containersCONTAINER ID BUILDER IMAGE ID IMAGE NAME CONTAINER NAME722d65178ae9 * 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 apache2fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/main/x86_64/APKINDEX.tar.gzfetch 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-installExecuting busybox-1.36.1-r2.triggerOK: 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.1Getting image source signaturesCopying blob cc2447e1835a doneCopying blob b12cf2dd7296 doneCopying config 2b176cc1a4 doneWriting manifest to image destinationStoring signatures
Petite vérification :
docker imagesdocker imagesREPOSITORY TAG IMAGE ID CREATED SIZEtest 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.18CMD ["/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.18Resolved "alpine" as an alias (/etc/containers/registries.conf.d/shortnames.conf)Trying to pull docker.io/library/alpine:3.18...Getting image source signaturesCopying blob 96526aa774ef [--------------------------------------] 0.0b / 0.0bCopying config 8ca4688f4f doneWriting manifest to image destinationStoring signatures[2/2] STEP 2/2: CMD ["/bin/echo", "Build with Buildah!"][2/2] COMMIT test:0.3Getting image source signaturesCopying blob cc2447e1835a skipped: already existsCopying blob 5f70bf18a086 doneCopying config 2e05f739c6 doneWriting manifest to image destinationStoring signatures--> 2e05f739c67Successfully tagged localhost/test:0.32e05f739c674c1050c1700cf9d889b157c79c23c3f2fb4e066e044922c57402b
On vérifie que l’image est bien produite :
buildah imagesREPOSITORY TAG IMAGE ID CREATED SIZElocalhost/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 signaturesCopying blob cc2447e1835a doneCopying blob 5f70bf18a086 doneCopying config 2e05f739c6 doneWriting manifest to image destinationStoring signatures
Un petit contrôle sous Docker :
REPOSITORY TAG IMAGE ID CREATED SIZEtest 0.3 2e05f739c674 3 minutes ago 7.34MBtest 0.1 2b176cc1a4c2 25 minutes ago 13.1MBalpine 3.18.4 8ca4688f4f35 4 weeks ago 7.34MBtest 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.3Build 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 temporairecontainer_name="mon_conteneur_temporaire"# Créer un conteneur Buildahcontainer_id=$(buildah from alpine)# Personnalisation de l'imagebuildah run $container_id apk add apache2# Commit de l'imagebuildah commit $container_id mon_image:1.0# Nettoyage du conteneur temporairebuildah rm $container_id# Pousser l'image vers le registrebuildah 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
↗