Les conteneurs Docker héritent du système de fichiers de leur image lors de la création initiale. Le système de fichiers du conteneur peut diverger du contenu de l’image après la création si des modifications sont apportées à la couche inscriptible du conteneur.

La possibilité d’inspecter les changements dans le système de fichiers peut vous aider à déboguer les problèmes et à rechercher les données manquantes. Les fichiers écrits dans le système de fichiers du conteneur seront perdus lorsque ce conteneur sera redémarré ou détruit. Dans certains cas, vous pouvez effectuer involontairement des écritures qui devraient plutôt être dirigées vers un volume persistant.

Dans cet article, nous allons partager quelques techniques pour identifier les modifications apportées aux systèmes de fichiers des conteneurs. Vous pouvez utiliser ces informations pour suivre l’activité des conteneurs et étudier les divergences entre différents environnements.

Comment exécuter Grafana dans un conteneur Docker ?

Utilisation de Docker Diff

L’interface CLI de Docker dispose d’une commande intégrée à cet effet. L’exécution de docker diff énumérera toutes les modifications apportées aux fichiers et aux répertoires dans un conteneur particulier. Elle accepte l’ID ou le nom du conteneur que vous souhaitez inspecter.

Démarrez un conteneur simple à des fins de démonstration :

$ docker run -it –name alpine alpine:latest sh

Cela va démarrer un nouveau conteneur exécutant l’image Alpine. Votre fenêtre de terminal sera attachée au conteneur. Gardez cette fenêtre ouverte.

Maintenant, exécutez docker diff dans une deuxième session de terminal :

$ docker diff alpine

Aucune sortie n’est produite car le nouveau conteneur correspond toujours exactement au système de fichiers de l’image Alpine.

Revenez à votre premier terminal qui est toujours attaché au conteneur. Exécutez quelques commandes qui ajoutent, suppriment ou modifient des fichiers :

/ # touch demo
/ # touch example

Revenez à votre première fenêtre shell. Répétez la commande docker diff pour voir les changements qui ont été effectués :

$ docker diff alpine
A /exemple
C /root
C /root/.ash_history
A /demo

Les deux nouveaux fichiers sont maintenant visibles dans la sortie de la commande. L’exécution de touch a également ajouté des entrées dans l’historique du shell du conteneur. La modification de /root/.ash_history est également signalée, ainsi que la modification conséquente du répertoire /root.

Interprétation de la sortie de Docker Diff

Chaque ligne de sortie produite par docker diff est préfixée par A, C ou D en fonction du type de changement qui s’est produit :

A - Le fichier ou le répertoire a été ajouté au système de fichiers du conteneur. Il n'existe pas dans l'image d'origine.
C - Le contenu du fichier ou du répertoire est différent de la version de l'image.
D - Un chemin présent dans l'image a été supprimé du conteneur.

Ces informations vous permettent de rechercher rapidement les divergences qui pourraient expliquer des données manquantes ou un comportement inattendu.

Toute modification du système de fichiers qui n’apparaît pas dans la sortie aura affecté les chemins qui sont mappés à un volume Docker. Ces fichiers sont stockés en dehors du conteneur, indépendamment de son système de fichiers, et ne sont donc pas affichés par docker diff .

Visualisation du contenu de l’image originale

Il peut être utile de comparer la version du fichier qui est incluse dans l’image originale. Vous pouvez le faire en créant un nouveau conteneur, puis en copiant le fichier. Utilisez docker create au lieu de docker run pour que le conteneur soit créé mais pas démarré. Cela garantira que les modifications causées par le script de point d’entrée de l’image n’affectent pas le résultat.

$ docker create –name temp-container my-image:latest
$ docker cp temp-container:/path/to/file copied-file
$ docker rm temp-container

Une autre méthode consiste à exécuter le conteneur avec un point d’entrée personnalisé qui émet le contenu du fichier sur le flux de sortie standard. Incluez l’indicateur –rm pour que le conteneur soit automatiquement supprimé à la fin de la commande :

$ docker run –rm –entrypoint cat alpine:latest /path/to/file > copied-file

Comparaison des différences entre deux conteneurs

Parfois, vous pouvez avoir besoin de comparer les différences entre deux conteneurs différents exécutant la même image. Utilisez d’abord docker diff pour obtenir les listes de changements individuels :

$ docker diff first-container > first
$ docker diff second-container > second

Vous pouvez maintenant utiliser des outils Unix standard tels que la commande diff pour trouver les différences entre les deux listes de modifications :

diff first second
3c3

< A /a-new-file

A /demo

Le diff montre que /a-new-file a été supprimé dans le deuxième conteneur tandis que /demo a été ajouté.

Une autre façon de comparer des conteneurs est d’utiliser docker export et la commande tar pour accéder à une liste complète de fichiers :

$ docker export demo-container | tar tv
-rwxr-xr-x 0/0 0 2022-06-21 14:21 .dockerenv
drwxr-xr-x 0/0 0 2022-05-23 17:51 bin/
lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/arch -> /bin/busybox
lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/ash -> /bin/busybox
lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/base64 -> /bin/busybox
lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/bbconfig -> /bin/busybox

Répétez cette commande pour vos deux conteneurs. Vous pouvez ensuite utiliser diff pour comparer les deux listes. La sortie améliorée de tar peut vous aider à savoir quand les fichiers ont été modifiés car les heures de modification et les permissions sont affichées.

Résumé

Les systèmes de fichiers des conteneurs Docker doivent ressembler de près à l’image à partir de laquelle ils ont été créés. Des divergences peuvent se produire lorsque le logiciel du conteneur écrit du contenu directement dans le système de fichiers. Les utilisateurs peuvent être une autre source de différences, lorsque des mécanismes tels que docker exec sont utilisés pour exécuter des commandes dans un conteneur en cours d’exécution.

L’utilitaire docker diff offre un moyen pratique de visualiser ces modifications. Bien que vous ne puissiez pas voir pourquoi un fichier a été ajouté ou supprimé, la possibilité de récupérer une liste des modifications peut être précieuse pour comprendre pourquoi un comportement particulier est observé.

Dans cet article, nous nous sommes concentrés sur l’examen des modifications apportées aux conteneurs en cours d’exécution. Vous pouvez utiliser différents outils tels que docker history et Dive pour inspecter les modifications apportées aux couches d’une image Docker. Les deux approches peuvent être utilisées en tandem, ce qui vous permet de déterminer l’endroit exact où un fichier a été ajouté ou modifié dans la pile de couches d’un conteneur.