[英]How to see docker image contents
我做了一个 docker 拉,可以列出下载的图像。 我想看看这张图片的内容。 在 .net 上进行了搜索,但没有直接的答案。
您可以使用该图像运行交互式 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
文件中。
这里接受的答案是有问题的,因为不能保证图像将具有任何类型的交互式外壳。 例如, 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
命令,它将容器文件系统导出为 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 create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$
docker save nginx > nginx.tar
tar -xvf nginx.tar
存在以下文件:
https://sreeinet.wordpress.com/2016/06/11/looking-inside-container-images/
或者
您可以使用Dive与 TUI 交互地查看图像内容
探索码头形象!
bash
或sh
... 首先检查镜像: 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
我们可以尝试一种更简单的方法,如下所示:
docker image inspect image_id
这在 Docker 版本中有效:
DockerVersion": "18.05.0-ce"
有一个名为 Anchore 的免费开源工具,您可以使用它来扫描容器图像。 此命令将允许您列出容器映像中的所有文件
anchore-cli 图像内容 myrepo/app:latest files
在 Commandeer 是一款付费应用程序中,您可以在侧面导航树视图中遍历文件,然后单击文件进行预览。您可以在下面看到这样的示例。
您可以在文档页面上阅读有关此功能的更多信息 - https://docs.getcommandeer.com/docs/Docker/viewing-your-files-in-a-docker-container/
这对我有用。!
在 Linux 上,假设vibrant_banach
镜像在一个容器中运行,名为vibrant_banach
,您可以使用 -
docker exec -it vibrant_banach bash
这将打开一个 bash shell,您可以在其中使用ls
查看您的文件。
也许这不是一种非常直接的方法,但这个方法对我有用。 我有一个 ECR Repo(Amazon Container Service Repository),我想查看它的代码。
这将使您到达文件。 甚至该文件也可能被压缩,因此请使用步骤 2 中提到的命令将其解压缩。
如果您不知道要搜索的代码,则需要检查在第 2 步之后获得的所有文件,这可能会有点累人。
一切顺利 !
如果你想在不运行的情况下检查图像内容,你可以这样做:
$ sudo bash
...
$ cd /var/lib/docker # default path in most installations
$ find . -iname a_file_inside_the_image.ext
... (will find the base path here)
这适用于当前默认的 BTRFS 存储驱动程序。
如果要在不启动容器的情况下列出图像中的文件:
docker create --name listfiles <image name>
docker export listfiles | tar -t
docker rm listfiles
Oneliner,没有 docker 运行(基于上述响应)
IMAGE=your_image docker create --name filelist $IMAGE command && docker export filelist | tar tf - | tree --fromfile . && docker rm filelist
相同,但将树结构报告给 result.txt
IMAGE=analytics_artifacts docker create --name filelist $IMAGE command && docker export filelist | tar tf - | tree --noreport --fromfile . | tee result.txt && docker rm filelist
我尝试了这个工具 - https://github.com/wagoodman/dive我发现它对探索 docker 图片的内容很有帮助。
使用 Docker EE for Windows(Hyper-V Server 2016 上的 17.06.2-ee-6)可以在主机操作系统的C:\ProgramData\docker\windowsfilter\
路径中检查 Windows 容器的所有内容。
无需特殊安装。
文件夹前缀可以通过docker ps -a
输出中的容器 id 找到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.