Construire des images Docker avec Ansible
Ansible-bender ↗ est une application développée par Tomas Tomecek ↗ qui permet de construire des images de container à partir de playbooks ansible plutôt que des fichiers Dockerfile. Ansible-bender s’appuie sur le moteur de container Podman plutôt que docker.
Podman et Buildah
Podman est une solution de containérisation comme l’est Docker développée par RedHat. Il utilise le même interpréteur de ligne de commande que Docker et donc les principales commandes de Docker fonctionne avec Podman. Podman fonctionne sans daemon comme instance de gestion pour gérer ses pods. Cela permet d’accéder aux différentes applications virtualisées sans droits root. Podman est devenu le moteur de conteneur par défaut sous RHEL8.
Buildah est un outil complémentaire à Podman qui permet de créer des images au format Open Container Initiative (OCI). Ces images sont compatibles avec la plupart des runtimes de containers, ceux compatible avec la norme OCI: docker, containerd, runc, … et donc kubernetes. Il utilise aussi les fichiers Dockerfile pour décrire les images.
Installation d’Ansible-bender et de ses prérequis
Provisionnement d’une VM avec vagrant
Je vais utiliser une machine provisionnée avec vagrant pour faire mes tests en prenant une box oracle8.
Comme vous pouvez le remarquer, il fait appel à playbook ansible pour configurer la vm produite, qui permet surtout de lancer des playbooks sans à spécifier le user vagrant et d’installer podman, buildah et ansible-bender. Pour ceux qui ne connaissent pas l’écriture de playbooks ansible je vous renvoie sur mon billet.
N’oubliez pas de changer le chemin de votre clé ssh !
Pour se connecter à notre vm il suffit de :
Construction d’une image docker avec ansible-bender
Le fonctionnement est assez simple. On utilise un playbook classique auquel on ajoute une variable ansible-bender pour indiquer :
- l’image de base
- le nom de l’image (tag) produit
- les volumes
- …
La seule contrainte est d’utiliser des images sources contenant déja python3.6 au minimun (ex: python:3-alpine)
Par exemple:
Construction de notre propre image
Je vais créer une image installant apache2 et affichant un simple fichier. Créer les deux fichiers suivant dans votre vm.
Le fichier file.html :
Le fichier playbook.yml
Vous remarquez que j’ai ajouté quelques variables à ansible-bender permettant d’exposer le port 80 (un tableau de string), la commande du container et squash qui permet d’aplatir l’image produite à un seul layer. La liste des toutes ces options se trouve ici ↗
Lançons la construction de l’image:
Qui retourne :
Lançons l’image construite :
Vérifions qu’elle fonctionne :
Mais combien a t’elle de layers ?
Un seul comme demandé.
Conclusion
Je trouve ansible-bender plutôt sexy et je pense même l’intégrer dans un runner gitlab pour construire quelques-unes de mes images. Un beau couple ansible docker !