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 sa création si des modifications sont apportées à la couche inscriptible du conteneur.
La possibilité d’inspecter les modifications apportées au 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 pourriez être en train d’effectuer involontairement des écritures qui devraient plutôt être dirigées vers un volume persistant.
Dans cet article, nous partagerons quelques techniques pour identifier les modifications apportées aux systèmes de fichiers conteneurs. Vous pouvez utiliser ces informations pour suivre l’activité du conteneur et étudier les écarts entre différents environnements.
Utilisation de Docker Diff
La CLI Docker a une commande intégrée à cet effet. Fonctionnement docker diff
énumérera toutes les modifications apportées aux fichiers et répertoires dans un conteneur particulier. Il 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 démarrera un nouveau conteneur exécutant l’image Alpine. Votre fenêtre de terminal sera attachée au conteneur. Gardez cette fenêtre ouverte.
Courez maintenant 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 encore attaché au conteneur. Exécutez certaines commandes qui ajoutent, suppriment ou modifient des fichiers :
/ # touch demo / # touch example
Revenez à votre première fenêtre de shell. Répétez le docker diff
commande pour voir les modifications qui ont été apportées :
$ docker diff alpine A /example C /root C /root/.ash_history A /demo
Maintenant, les deux nouveaux fichiers sont visibles dans la sortie de la commande. Fonctionnement touch
également ajouté des entrées à l’historique du shell du conteneur. La modification à /root/.ash_history
est également signalé, ainsi que la modification consécutive de la /root
annuaire.
Interprétation de la sortie Docker Diff
Chaque ligne de sortie produite par docker diff
est préfixé soit par A
, C
ou D
selon le 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 dans l’image.D
– Un chemin présent dans l’image a été supprimé du conteneur.
Ces informations vous permettent de rechercher rapidement les écarts 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 affectera les chemins mappés à un volume Docker. Ces fichiers sont stockés à l’extérieur du conteneur, indépendamment de son système de fichiers, de sorte qu’ils ne sont pas exposés par docker diff
.
Affichage du contenu dans l’image d’origine
Il peut être utile de comparer la version du fichier incluse dans l’image d’origine. Vous pouvez le faire en créant un nouveau conteneur, puis en copiant le fichier. Utilisation docker create
à la place de docker run
le conteneur est donc 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 vers le flux de sortie standard. Inclure le --rm
flag pour que le conteneur soit automatiquement supprimé une fois la commande terminée :
$ docker run --rm --entrypoint cat alpine:latest /path/to/file > copied-file
Comparaison des différences entre deux conteneurs
Parfois, vous devrez peut-être comparer les différences entre deux conteneurs différents exécutant la même image. Première utilisation docker diff
pour obtenir les listes de modifications individuelles :
$ docker diff first-container > first $ docker diff second-container > second
Vous pouvez désormais utiliser les outils Unix standard tels que diff
commande pour trouver les différences dans les deux listes de modifications :
diff first second 3c3 < A /a-new-file --- > A /demo
La différence montre que /a-new-file
a été retiré dans le deuxième conteneur alors que /demo
a été ajouté.
Une autre façon de comparer les conteneurs consiste à 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
comparer les deux listes. La sortie améliorée de tar peut vous aider à savoir quand les fichiers ont été modifiés à mesure que les heures de modification et les autorisations sont affichées.
Sommaire
Les systèmes de fichiers des conteneurs Docker doivent ressembler étroitement à 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.
La docker diff
fournit 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 de modifications peut être inestimable 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 Plongez pour inspecter les modifications apportées aux couches dans une image Docker. Les deux approches peuvent être utilisées en tandem, ce qui vous permet de déterminer le point exact auquel un fichier a été ajouté ou modifié dans la pile de couches d’un conteneur.