如何查看Docker映像内容


290

我做了一个docker pull,可以列出下载的图像。我想看这张图片的内容。在网上进行了搜索,但没有直接答案。



10
不是骗子 查看容器和图像不是同一件事。您可能想要查看初始文件系统,甚至在映像有机会运行之前验证映像中没有恶意文件。
Keilaron

4
如果您无法将映像作为容器运行,则可以使用驱动器之类的工具(github.com/wagoodman/dive),也可以使用docker save将映像导出为tar文件。然后,您可以探索焦油或潜水,也可以尽快探索图像。
FunThomas424242 '19

不是
骗子,

Answers:


371

您可以使用该图像运行一个交互式外壳容器,并浏览该图像具有的任何内容。

例如:

docker run -it image_name sh

或关注带有 entrypoint

docker run -it --entrypoint sh image_name

或者,如果您想查看图像的构建方式,即图像中的步骤Dockerfile,则可以:

docker image history --no-trunc image_name > image_history

步骤将被登录到image_history文件中。


1
谢谢。第一个是我要寻找的。基本上浏览文件夹。
pylearn

9
我正在尝试查看使用“ FROM暂存”创建的图像的内容,并且没有可用的外壳。还有其他查看内容的方法吗?我要查看的图像是门卫/门卫。
胡安·埃尔南德斯

2
有人可以看到图像的内容而不生成容器吗?还是我们可以假设所有人都是安全的,除非他们有权从中产生容器?
Shabirmean

3
结合之前所说的“对于带有入口点的Windows容器”:docker run -it --entrypoint cmd <image_name>将起作用。
Beytan Kurt,

2
@JuanHernandez,是的,您可以按照stackoverflow.com/a/42677219/320594中的指示转储映像的全部内容。
Jaime Hablutzel

197

这里接受的答案是有问题的,因为不能保证图像将具有任何类型的交互式外壳。例如,无人机/无人机图像包含在单个命令中/drone并且还具有一个ENTRYPOINT,因此将失败:

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

这将失败:

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

这并非不常见的配置;许多最小映像仅包含支持目标服务所需的二进制文件。幸运的是,存在用于探索图像文件系统的机制,这些机制不依赖于图像的内容。最简单的docker export命令可能是将容器文件系统导出为tar存档的命令。因此,启动一个容器(它失败与否无关紧要):

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

然后用于docker export将文件系统导出到tar

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

docker ps -lq那里的意思是“给我最近泊坞窗容器的id”。您可以将其替换为明确的容器名称或ID。


5
这个答案是超级有帮助的数字可能是一个容器里面是什么在给定时间
若奥·安德拉德

2
这个答案是更正确的,并且对我
有用

94

您不应该只是为了查看图像内容而启动容器。例如,您可能想要查找恶意内容,而不是运行它。使用“创建”而不是“运行”;

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

11
上面的第二行仅列出了文件系统内容。如果要以tar格式获取所有文件,可以将其替换为docker export tmp_$$ > image-fs.tar
皮诺

Windows OS的第二行是什么?该docker export tmp_$$ | tar t会无法正常工作。
阿列克谢·马里尼琴科

@Alexei Marinichenko tar可能未安装在您的计算机上。尝试tar --help检查它。
Abdurrahman I.

1
如果容器中没有外壳,这也可以工作
Peter Dotchev

3
@AlexeiMarinichenko,您可以使用-o参数指定要写入的文件。例如docker export -o c:\temp\tmp_$$.tar tmp_$$
GiddyUpHorsey,

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

存在以下文件:

  • manifest.json –描述文件系统层和具有Container属性的json文件的名称。
  • .json –容器属性
  • –每个“ layerid”目录都包含描述该图层属性和与该图层关联的文件系统的json文件。Docker将容器映像存储为层,以通过在映像之间重用层来优化存储空间。

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

要么

您可以使用潜水与TUI交互地查看图像内容

在此处输入图片说明

https://github.com/wagoodman/dive


5
这对我来说似乎是最有用的答案,因为您不必启动容器来获取文件。
亚历克·托马斯

1
绝对同意@AlecThomas-并进一步采取行动,为什么我什docker至只需要查看本质上只是一种不同类型的存档文件的内容。
Ed Randall

好的答案,我还将指定标签:docker save --output nginx.tar nginx:latest,否则,根据文档,它将包含“所有父层以及所有标签和版本”
Tarek

这应该被赞成,因为如果您没有任何Unix utils,这可能是探索内部结构的唯一方法。同样,这种方式不需要创建容器。
Stanislav German-Evtushenko

9

要列出图像的详细内容,您必须在docker run --rm image/name ls -alR其中运行,这--rm意味着一旦退出容器就将其删除。

在此处输入图片说明


11
假设图像ls可用,并且在PATH
chaosaffe

6

探索DOCKER图像

  1. 弄清楚什么样的壳是有bashsh或...

    首先检查图像: docker inspect name-of-container-or-image

    在json返回中查找entrypointcmd

  2. 然后做: docker run --rm -it --entrypoint=/bin/bash name-of-image

    一旦进入do:ls -lsa或任何其他shell命令,例如:cd ..

    -it交互式……和tty 的代表。--rm运行后取出容器的支架。


1
答案的问题在于,如接受的答案所述,不能保证您的映像中包含任何外壳。或者ls。或者实际上是所有通用工具。
larsks

4

我们可以尝试一种更简单的方法,如下所示:

docker image inspect image_id

这适用于Docker版本:

DockerVersion": "18.05.0-ce"

12
这没有显示内容 ; 它仅显示构建图像的图层等。
罗杰·利普斯科姆

0

使用适用于Windows的Docker EE(Hyper-V Server 2016上的17.06.2-ee-6),可以C:\ProgramData\docker\windowsfilter\在主机OS的路径上检查Windows容器的所有内容。

无需特殊安装。

文件夹前缀可以通过docker ps -a输出中的容器ID找到。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.