Valider une image avec container-structure-test
Je vous décris mon besoin. Je suis en train de construire avec
ansible un outil permettant de construire une
trentaine d’images docker à partir de templates de Dockerfile et de
fichiers de test. Dans un premier il récupère les dernières versions des outils
utilisés avec lastversion pour les injecter et produire les Dockerfile et
les fameux fichiers de test. Le tout tourne dans gitlab, via un ci déclenché
une fois par semaine. Dans ce ci, dynamique,
les tests sont exécutés en utilisant container-structure-test
. En cas de
succès l’image est envoyé dans la registry docker de
gitlab et est prête à l’utilisation.
Container-structure-test ↗ est un outil qui comme son nom l’indique permet de valider la structure d’une image.
Installation de container-structure-test
L’installation se fait classiquement via une commande curl :
Ecriture du fichier de test
Le fichier de configuration contenant les tests est un fichier écrit en json ou en yaml.
Le fichier débute toujours par une entête de ce type :
Ensuite dans ce fichier de configuration, on peut utiliser quatre types de tests :
- Tests sur les commandes : on peut tester la sortie ou les erreurs d’une commande
- Tests d’existence de fichiers : on peut contrôler la présence ou pas d’un fichier dans le système de fichiers de l’image
- Tests de contenu de fichier : le fichier contient t’il les données attendues
- Test sur les métadonnées de l’image
Les tests sur les commandes
Les tests de commande garantissent que les commandes s’exécutent correctement dans l’image cible. Les expressions régulières peuvent être utilisées pour vérifier les chaînes attendues ou pas à la fois dans la sortie standard ou dans celle des erreurs (stdout et stderr):
Tests d’existence de fichiers
Les tests d’existence de fichiers vérifient qu’un fichier (ou un répertoire) est présent ou est absent du système de fichiers de l’image. Ici le contenu des fichiers ou des répertoires ne sont pas contrôlé.
Tests de contenu des fichiers
Les tests de contenu de fichier ouvrent un fichier sur le système de fichiers et vérifient son contenu. Ces tests supposent que le fichier spécifié est un fichier et qu’il existe. Les expressions régulières peuvent à nouveau être utilisées pour vérifier le contenu attendu ou exclu dans le fichier spécifié.
Tests sur les métadonnées
Les tests des métadonnées garantit que le conteneur est correctement configuré. Toutes ces vérifications sont facultatives. Ici on teste la présence des variables d’environnement, de ports ouverts, de volumes, de commande (cmd et entrypoint), de l’utilisateur d”exécution et du répertoire de travail.
! Attention au moment ou j’écris ces lignes la metadata user retourne une erreur !
Mise en pratique
Je vais prendre l’exemple d’image contenant bandit, un outil permettant de contrôler si du code python contient des failles de sécurité. Je l’utilise dans gitlab et donc via une image docker.
Voici son Dockerfile qui utilise les techniques du multi-stage et de la copie de l’environnement virtuel ↗ permettant de limiter la taille de celle-ci:
Je vais tester :
- les métadonnées :
- env PATH contient bien /venv/bin
- env PYTHONPATH = /venv/lib/python3.9/site-packages/
- user = user,
- workdir = /src,
- entrypoint = [“bandit”, “-r”]
- cmd = CMD [“—version”]
- le lancement de la commande bandit —version retourne la version attendue
- que la commande
which bandit
retourne bien - que le fichier
/etc/os-release
contient bien la version attendue - que le certificat n’est pas présent
Le fichier de test :
Pour les metadata si on souhaite utiliser des regex il faut l’indiquer avec
isRegex
. Au cas ou il y dans les chaines des caractères spéciaux il faudra bien
faire attention à les échapper avec \
.
Lancement des tests
Voila qui permet de valider que l’image est bien conforme à ce qui était attendu. Couplé à trivy (scan de vulnérabilités) et on peut valider l’utilisation de l’image dans nos ci.
Plus d’infos sur cet outil sur la page du projet GoogleContainerTools/container-structure-test ↗