Cómo ver el contenido de la imagen del acoplador

291

Hice una extracción de la ventana acoplable y puedo enumerar la imagen que se descargó. Quiero ver el contenido de esta imagen. Hice una búsqueda en la red pero no hubo una respuesta directa.

pylearn
fuente
2
Posible duplicado del sistema de archivos del contenedor
Vadzim
10
No es un tonto. Ver el contenedor y la imagen no es lo mismo. Es posible que desee ver el sistema de archivos inicial o incluso validar que no hay nada malicioso dentro de la imagen antes de que tenga la oportunidad de ejecutarse.
Keilaron
44
si no puede ejecutar la imagen como contenedor, puede usar una herramienta como drive ( github.com/wagoodman/dive ) o puede usar docker save para exportar la imagen como archivo tar. Luego puede explorar el alquitrán o, con la inmersión, puede explorar la imagen lo antes posible.
FunThomas424242
No soy un tonto, pero puedes encontrar la respuesta aquí: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoui

Respuestas:

372

Simplemente puede ejecutar un contenedor de shell interactivo usando esa imagen y explorar cualquier contenido que tenga esa imagen.

Por ejemplo:

docker run -it image_name sh

O siguiendo para imágenes con un entrypoint

docker run -it --entrypoint sh image_name

O, si desea ver cómo se construyó la imagen, es decir, los pasos en ella Dockerfile, puede:

docker image history --no-trunc image_name > image_history

Los pasos se registrarán en el image_historyarchivo.

Ayman Nedjmeddine
fuente
1
Gracias. El primero es lo que estoy buscando. Básicamente explorar las carpetas.
pylearn
9
Estoy tratando de ver el contenido de una imagen que se crea usando "DESDE cero" y no hay ningún shell disponible. ¿Hay alguna otra forma de ver los contenidos? La imagen que intento ver es portainer / portainer.
Juan Hernández
2
¿Es posible que alguien vea el contenido de la imagen sin generar un contenedor? ¿O podemos suponer que está a salvo de todos a menos que tengan derechos para generar un contenedor?
Shabirmean
3
combinando lo que se dijo antes "para un contenedor de Windows con punto de entrada": docker run -it --entrypoint cmd <image_name>funcionará.
Beytan Kurt
2
@JuanHernandez, sí, puede volcar el contenido completo de la imagen como se indica en stackoverflow.com/a/42677219/320594 .
Jaime Hablutzel
197

La respuesta aceptada aquí es problemática, porque no hay garantía de que una imagen tenga algún tipo de shell interactivo. Por ejemplo, la imagen de drone / drone contiene un solo comando /drone, y también tiene un comando ENTRYPOINT, por lo que fallará:

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

Y esto fallará:

$ 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".

Esta no es una configuración poco común; muchas imágenes mínimas contienen solo los binarios necesarios para admitir el servicio de destino. Afortunadamente, existen mecanismos para explorar un sistema de archivos de imagen que no dependen del contenido de la imagen. El más fácil es probablemente el docker exportcomando, que exportará un sistema de archivos contenedor como un archivo tar. Entonces, inicie un contenedor (no importa si falla o no):

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

Luego, use docker exportpara exportar el sistema de archivos a tar:

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

El docker ps -lqallí significa "dame la identificación del contenedor docker más reciente". Puede reemplazar eso con un nombre o id explícito del contenedor.

larsks
fuente
55
esta respuesta es muy útil para calcular qué podría estar dentro de un contenedor en un momento dado
João Andrade
2
Esta respuesta es más correcta y funciona para mí, ya que quiero explorar el contenido de la imagen con arquitectura extranjera y no puedo "simplemente ejecutarla"
Vladimir Perevalov
94

No debe iniciar un contenedor solo para ver el contenido de la imagen. Por ejemplo, es posible que desee buscar contenido malicioso, no ejecutarlo. Use "crear" en lugar de "ejecutar";

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$
lgekman
fuente
11
La segunda línea anterior solo enumera el contenido del sistema de archivos. Si desea obtener todos los archivos como un alquitrán, puede reemplazarlo con algo así docker export tmp_$$ > image-fs.tar.
Pino
¿Cuál será la segunda línea para el sistema operativo Windows? El docker export tmp_$$ | tar tno funcionará.
Alexei Marinichenko
@Alexei Marinichenko tarpodría no estar instalado en su máquina. Intenta tar --helpcomprobarlo.
Abdurrahman I.
1
Esto también funciona si no hay caparazón en el contenedor
Peter Dotchev
3
@AlexeiMarinichenko puede usar el -oparámetro para especificar el archivo para escribir. Por ej docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey
62
docker save nginx > nginx.tar
tar -xvf nginx.tar

Los siguientes archivos están presentes:

  • manifest.json: describe las capas del sistema de archivos y el nombre del archivo json que tiene las propiedades de Contenedor.
  • .json - Propiedades del contenedor
  • - Cada directorio "layerid" contiene un archivo json que describe la propiedad de la capa y el sistema de archivos asociado con esa capa. Docker almacena las imágenes del Contenedor como capas para optimizar el espacio de almacenamiento mediante la reutilización de capas en las imágenes.

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

O

puedes usar dive para ver el contenido de la imagen de forma interactiva con TUI

ingrese la descripción de la imagen aquí

https://github.com/wagoodman/dive

Andy Wong
fuente
55
Esta parece ser la respuesta más útil para mí, ya que no tiene que iniciar un contenedor para obtener los archivos.
Alec Thomas
1
Absolutamente de acuerdo @AlecThomas, y para ir un paso más allá, ¿por qué dockersolo necesito ver el contenido de lo que es, esencialmente, solo un tipo diferente de archivo?
Ed Randall
buena respuesta, también especificaría la etiqueta: de lo docker save --output nginx.tar nginx:latestcontrario, de acuerdo con el documento, contendrá "todas las capas principales y todas las etiquetas + versiones"
Tarek
Esto debería ser votado ya que esta es probablemente la única forma de explorar aspectos internos si no tiene ninguna de las utilidades de Unix en su interior. Además, esta forma no requiere la creación de un contenedor.
Stanislav German-Evtushenko
9

Para enumerar el contenido detallado de una imagen, debe ejecutar docker run --rm image/name ls -alRdonde --rmsignifica eliminar tan pronto como salga de un contenedor.

ingrese la descripción de la imagen aquí

Serge Voloshenko
fuente
11
Esto supone que la imagen está lsdisponible y en elPATH
chaosaffe
6

¡EXPLORANDO LA IMAGEN DE DOCKER !

  1. Averiguar qué tipo de concha es de allí basho sh, o ...

    Inspeccione la imagen primero: docker inspect name-of-container-or-image

    Busque entrypointo cmden el json return.

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

    una vez dentro do: ls -lsao cualquier otro comando de shell como:cd ..

    Los -itsoportes para interactivo ... y tty. Los --rmsoportes para quitar el contenedor después de la ejecución.

Khalil Gharbaoui
fuente
1
El problema con esta respuesta es que, como se discutió en la respuesta aceptada, no hay garantía de que su imagen tenga ningún caparazón. O ls. O realmente cualquier herramienta común en absoluto.
Larsks
4

Podemos probar uno más simple de la siguiente manera:

docker image inspect image_id

Esto funcionó en la versión de Docker:

DockerVersion": "18.05.0-ce"
Subham Chowdhury
fuente
12
Esto no muestra el contenido ; solo muestra las capas, etc., que se utilizaron para construir la imagen.
Roger Lipscombe
0

Con Docker EE para Windows (17.06.2-ee-6 en Hyper-V Server 2016), todo el contenido de los Contenedores de Windows se puede examinar en la C:\ProgramData\docker\windowsfilter\ruta del sistema operativo host.

No se necesita montaje especial.

El prefijo de carpeta se puede encontrar por la identificación del contenedor de la docker ps -asalida.

Vadzim
fuente
-1

Existe una herramienta gratuita de código abierto llamada Anchore que puede usar para escanear imágenes de contenedor. Este comando le permitirá enumerar todos los archivos en una imagen de contenedor

anchore-cli image content myrepo / app: últimos archivos

https://anchore.com/opensource/

usuario11845290
fuente