如何查看 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 映像!
-
弄清楚
bash
或sh
里面有什么样的shell...
先检查图片:docker inspect name-of-container-or-image
在 JSON 返回中查找 entrypoint
或 cmd
。
-
然后执行:
docker run --rm -it --entrypoint=/bin/bash name-of-image
一旦进入:ls -lsa
或任何其他 shell 命令,如:cd ..
-it
代表交互式...和 TTY。 --rm
代表运行后删除容器。
如果没有像ls
或bash
这样的常用工具,并且您可以访问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 镜像内容的主要内容,如果未能解决你的问题,请参考以下文章