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