Comment voir le contenu d'une image Docker


291

J'ai fait un docker et je peux lister l'image téléchargée. Je veux voir le contenu de cette image. A fait une recherche sur le net mais pas de réponse directe.



10
Pas dupe. Voir le conteneur et l'image ne sont pas la même chose. Vous voudrez peut-être afficher le système de fichiers initial ou même valider qu'il n'y a rien de malveillant à l'intérieur de l'image avant qu'elle ne puisse s'exécuter.
Keilaron

4
si vous ne pouviez pas exécuter l'image en tant que conteneur, vous pouvez utiliser un outil tel que lecteur ( github.com/wagoodman/dive ) ou vous pouvez utiliser docker save pour exporter l'image en tant que fichier tar. Ensuite, vous pouvez explorer le goudron ou avec la plongée, vous pouvez dès que possible explorer l'image.
FunThomas424242

Pas dupe, mais vous pouvez trouver la réponse ici: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoui

Réponses:


373

Vous pouvez simplement exécuter un conteneur de shell interactif à l'aide de cette image et explorer le contenu de cette image.

Par exemple:

docker run -it image_name sh

Ou suivre pour les images avec un entrypoint

docker run -it --entrypoint sh image_name

Ou, si vous voulez voir comment l'image a été créée, c'est-à-dire les étapes dans son Dockerfile, vous pouvez:

docker image history --no-trunc image_name > image_history

Les étapes seront enregistrées dans le image_historyfichier.


1
Merci. Le premier est ce que je recherche. Explorez essentiellement les dossiers.
pylearn

9
J'essaie de voir le contenu d'une image créée en utilisant "FROM scratch" et il n'y a pas de shell disponible. Existe-t-il une autre façon de voir le contenu? L'image que j'essaie de voir est portainer / portainer.
Juan Hernandez

2
Est-il possible que quelqu'un voit le contenu de l'image sans créer un conteneur? Ou pouvons-nous supposer qu'il est à l'abri de tout sauf s'ils ont le droit d'en faire apparaître un conteneur?
Shabirmean

3
combiner ce qui est dit avant "pour un conteneur Windows avec point d'entrée": docker run -it --entrypoint cmd <image_name>fonctionnera.
Beytan Kurt

2
@JuanHernandez, oui, vous pouvez vider le contenu complet de l'image comme indiqué dans stackoverflow.com/a/42677219/320594 .
Jaime Hablutzel

197

La réponse acceptée ici est problématique, car il n'y a aucune garantie qu'une image aura une sorte de shell interactif. Par exemple, l' image drone / drone contient une seule commande /drone, et elle en a également une ENTRYPOINT, donc cela échouera:

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

Et cela échouera:

$ docker run --rm -it --entrypoint sh drone/drone
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sh\": executable file not found in $PATH".

Ce n'est pas une configuration rare; de nombreuses images minimales contiennent uniquement les fichiers binaires nécessaires pour prendre en charge le service cible. Heureusement, il existe des mécanismes pour explorer un système de fichiers image qui ne dépendent pas du contenu de l'image. La plus simple est probablement la docker exportcommande, qui exportera un système de fichiers conteneur sous forme d'archive tar. Donc, démarrez un conteneur (peu importe s'il échoue ou non):

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

Utilisez ensuite docker exportpour exporter le système de fichiers vers tar:

$ docker export $(docker ps -lq) | tar tf -

Le docker ps -lqlà signifie « me donne l'identifiant du conteneur le plus récent docker ». Vous pouvez remplacer cela par un nom ou un identifiant de conteneur explicite.


5
cette réponse est super utile pour comprendre ce qui pourrait être à l'intérieur d'un conteneur à un moment donné
João Andrade

2
Cette réponse est plus correcte et fonctionne pour moi, car je veux explorer le contenu de l'image avec une architecture étrangère et je ne peux pas "simplement l'exécuter"
Vladimir Perevalov

94

Vous ne devez pas démarrer un conteneur juste pour voir le contenu de l'image. Par exemple, vous souhaiterez peut-être rechercher du contenu malveillant, et non l'exécuter. Utilisez "créer" au lieu de "exécuter";

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$

11
La 2e ligne ci-dessus répertorie simplement le contenu du système de fichiers. Si vous voulez obtenir tous les fichiers sous forme de tar, vous pouvez le remplacer par quelque chose comme docker export tmp_$$ > image-fs.tar.
Pino

Quelle sera la 2ème ligne pour Windows OS? Le docker export tmp_$$ | tar tne fonctionnera pas.
Alexei Marinichenko

@Alexei Marinichenko tarn'est peut-être pas installé sur votre ordinateur. Essayez tar --helpde le vérifier.
Abdurrahman I.

1
Cela fonctionne également s'il n'y a pas d'obus dans le conteneur
Peter Dotchev

3
@AlexeiMarinichenko, vous pouvez utiliser le -oparamètre pour spécifier le fichier dans lequel écrire. Par exemple docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey

62
docker save nginx > nginx.tar
tar -xvf nginx.tar

Les fichiers suivants sont présents:

  • manifest.json - Décrit les couches du système de fichiers et le nom du fichier json qui a les propriétés Container.
  • .json - Propriétés du conteneur
  • - Chaque répertoire «layerid» contient un fichier json décrivant la propriété de la couche et le système de fichiers associés à cette couche. Docker stocke les images de conteneur sous forme de couches pour optimiser l'espace de stockage en réutilisant les couches sur les images.

https://sreeninet.wordpress.com/2016/06/11/looking-inside-container-images/

OU

vous pouvez utiliser la plongée pour afficher le contenu de l'image de manière interactive avec TUI

entrez la description de l'image ici

https://github.com/wagoodman/dive


5
Cela me semble être la réponse la plus utile, car vous n'avez pas besoin de démarrer un conteneur pour obtenir les fichiers.
Alec Thomas

1
Entièrement d'accord @AlecThomas - et pour aller plus loin, pourquoi ai-je dockerseulement besoin de voir le contenu de ce qui est, essentiellement, juste un type de fichier d'archive différent.
Ed Randall

bonne réponse, je préciserais également le tag: docker save --output nginx.tar nginx:latestsinon, selon le doc, il contiendra "tous les calques parents, et tous les tags + versions"
Tarek

Cela devrait être voté car c'est probablement le seul moyen d'explorer les internes si vous n'avez aucun utilitaire Unix à l'intérieur. De plus, cette méthode ne nécessite pas la création d'un conteneur.
Stanislav German-Evtushenko

9

Pour répertorier le contenu détaillé d'une image, vous devez exécuter docker run --rm image/name ls -alR--rmsignifie supprimer dès que les sorties forment un conteneur.

entrez la description de l'image ici


11
Cela suppose que l'image est lsdisponible et dans laPATH
chaosaffe

6

DÉCOUVREZ L'IMAGE DU QUAI !

  1. Découvrez quel type de coque est là bashou shou ...

    Inspectez d'abord l'image: docker inspect name-of-container-or-image

    Recherchez entrypointou cmddans le retour json.

  2. Alors fais: docker run --rm -it --entrypoint=/bin/bash name-of-image

    une fois à l'intérieur de do: ls -lsaou toute autre commande shell comme:cd ..

    Le -itsignifie interactif ... et tty. les --rmstands pour enlever le conteneur après l'exécution.


1
Le problème avec cette réponse est que, comme discuté dans la réponse acceptée, il n'y a aucune garantie que votre image contient un shell. Ou ls. Ou vraiment des outils communs.
larsks

4

Nous pouvons en essayer une plus simple comme suit:

docker image inspect image_id

Cela a fonctionné dans la version Docker:

DockerVersion": "18.05.0-ce"

12
Cela ne montre pas la contenu ; il ne montre que les calques, etc., qui ont servi à la construction de l'image.
Roger Lipscombe

0

Avec Docker EE pour Windows (17.06.2-ee-6 sur Hyper-V Server 2016), tout le contenu des conteneurs Windows peut être examiné sur le C:\ProgramData\docker\windowsfilter\chemin du système d'exploitation hôte.

Aucun montage spécial nécessaire.

Le préfixe de dossier peut être trouvé par l'ID de conteneur à partir de la docker ps -asortie.


-1

Il existe un outil open source gratuit appelé Anchore que vous pouvez utiliser pour numériser des images de conteneurs. Cette commande vous permettra de lister tous les fichiers dans une image conteneur

Contenu de l'image anchore-cli myrepo / app: derniers fichiers

https://anchore.com/opensource/

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.