如何查看 docker 镜像内容

Posted

技术标签:

【中文标题】如何查看 docker 镜像内容【英文标题】:How to see docker image contents 【发布时间】:2017-11-29 20:38:34 【问题描述】:

我做了一个 docker pull 并且可以列出下载的图像。我想看看这张图片的内容。网上搜了下,没有答案。

【问题讨论】:

Exploring Docker container's file system的可能重复 不是骗子。查看容器和图像不是一回事。您可能想查看初始文件系统,甚至在图像有机会运行之前验证图像中没有恶意内容。 如果您无法将镜像作为容器运行,您可以使用驱动器 (github.com/wagoodman/dive) 之类的工具,也可以使用 docker save 将镜像导出为 tar 文件。然后您可以探索焦油或潜水,您可以尽快探索图像。 不是骗子,但您可以在这里找到答案:***.com/a/40324326/5641227 【参考方案1】:

您可以使用该图像运行一个交互式 shell 容器并探索该图像的任何内容。

例如:

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 文件中。

【讨论】:

我正在尝试查看使用“从头开始”创建的图像的内容,但没有可用的 shell。有没有其他方法可以查看内容?我要查看的图像是搬运工/搬运工。 是否有人可以在不生成容器的情况下看到图像的内容?或者我们可以假设它对所有人都是安全的,除非他们有权从中生成容器? 结合之前所说的“对于带有入口点的 Windows 容器”:docker run -it --entrypoint cmd <image_name> 将起作用。 @JuanHernandez,是的,您可以转储图像的全部内容,如***.com/a/42677219/320594 所示。 这个答案不好,因为它取决于在图像中有一个外壳,但情况并非总是如此。如果您对独立检查每个图像层不感兴趣,docker create 答案是该问题的最佳答案。【参考方案2】:

这里接受的答案是有问题的,因为不能保证图像将具有任何类型的交互式外壳。例如,drone/drone 图像在单个命令中包含 /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 命令,它将container 文件系统导出为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 的意思是“给我最近的 docker 容器的 id”。您可以将其替换为明确的容器名称或 id。

【讨论】:

也可以像docker export $(docker ps -lq) -o foo.tar一样使用out参数【参考方案3】:

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

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

【讨论】:

上面的第二行只是列出了文件系统的内容。如果您想将所有文件作为 tar 获取,可以将其替换为 docker export tmp_$$ > image-fs.tar Windows 操作系统的第二行是什么? docker export tmp_$$ | tar t 将不起作用。 如果容器中没有外壳,这也有效 @AlexeiMarinichenko 您可以使用-o 参数指定要写入的文件。例如。 docker export -o c:\temp\tmp_$$.tar tmp_$$. docker 使用No command specified 为我创建命令错误。在最后放置一个像ls 这样的虚拟命令(即使容器启动时命令会失败)似乎有效。 docker create --name="tmp_$$" image:tag ls【参考方案4】:
docker save nginx > nginx.tar
tar -xvf nginx.tar

存在以下文件:

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

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

您可以使用 dive 与 TUI 交互查看图像内容

https://github.com/wagoodman/dive

【讨论】:

这对我来说似乎是最有用的答案,因为您不必启动容器来获取文件。 完全同意@AlecThomas - 更进一步,为什么我什至需要docker 只是为了查看本质上只是一种不同类型的存档文件的内容。跨度> 好答案,我还要指定标签:docker save --output nginx.tar nginx:latest,否则,根据文档,它将包含“所有父层,以及所有标签+版本” 这应该被赞成,因为如果你里面没有任何 Unix 工具,这可能是探索内部的唯一方法。这种方式也不需要创建容器。 在过去的 5 年里,如果没有这个工具,我是如何生存下来的?【参考方案5】:

探索 Docker 映像

    弄清楚bashsh里面有什么样的shell...

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

在 JSON 返回中查找 entrypointcmd

    然后执行:docker run --rm -it --entrypoint=/bin/bash name-of-image

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

-it 代表交互式...和 ​​TTY。 --rm 代表运行后删除容器。

如果没有像lsbash 这样的常用工具,并且您可以访问Dockerfile,只需将常用工具添加为图层。 示例(高山 Linux):

RUN apk add --no-cache bash

当您无权访问 Dockerfile 时,只需从新创建的容器中复制/提取文件并查看它们:

docker create <image>  # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah

【讨论】:

这个答案的问题在于,正如在接受的答案中所讨论的那样,不能保证您的图像中有 any 外壳。或ls。或者实际上是任何常用工具。 是的,这里假设有常用工具。如果您被允许将该层添加到答案中并解释如何提取文件,那么您当然可以始终添加一个外壳。【参考方案6】:

要列出图像的详细内容,您必须运行docker run --rm image/name ls -alR,其中--rm 表示从容器退出后立即删除。

【讨论】:

这假定图像有ls 可用并且在PATH【参考方案7】:

我们可以尝试如下更简单的:

docker image inspect image_id

这在 Docker 版本中有效:

DockerVersion": "18.05.0-ce"

【讨论】:

这不显示内容;它只显示用于构建图像的层等。【参考方案8】:

有一个名为 Anchore 的免费开源工具,您可以使用它来扫描容器映像。此命令将允许您列出容器映像中的所有文件

anchore-cli 图片内容 myrepo/app:latest files

https://anchore.com/opensource/

【讨论】:

【参考方案9】:

在 Commandeer 中,这是一个付费应用程序,您可以在侧导航树视图中遍历文件,然后单击文件进行预览。您可以在下面看到一个示例。

您可以在文档页面上阅读有关此功能的更多信息 - https://docs.getcommandeer.com/docs/Docker/viewing-your-files-in-a-docker-container/

【讨论】:

【参考方案10】:

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

无需特殊安装。

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

【讨论】:

以上是关于如何查看 docker 镜像内容的主要内容,如果未能解决你的问题,请参考以下文章

查看Docker里的镜像信息

如何查看dockerhub的所有镜像

在docker私有仓库如何查看有哪些镜像?

docker 如何保存镜像到本地 docker如何读取本地保存的镜像

如何给Docker配置官方国内加速镜像

如何给Docker配置官方国内加速镜像