如何查看docker镜像内容

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

548571 次浏览

如果图像包含shell,您可以使用该图像运行交互式shell容器并探索该图像具有的任何内容。如果sh不可用,则可能是busyboxash 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。例如,无人机/无人机图像在单个命令/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 run --rm image/name ls -alR,其中--rm表示在退出容器后立即删除。

在此处输入图片描述

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

无需特殊安装。

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

我们可以尝试一个更简单的方法如下:

docker image inspect image_id

这在Docker版本中有效:

DockerVersion": "18.05.0-ce"

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

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$
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/

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

在此处输入图片描述

https://github.com/wagoodman/dive

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

anchore-cli图像内容myrepo/app:最新文件

https://anchore.com/opensource/

探索码头工人形象

  1. 弄清楚里面有什么样的shellbashsh

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

在JSON返回中查找entrypointcmd

  1. 然后做: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


也许这不是一个非常直接的方法,但这一个对我有用。 我有一个ECRRepo(Amazon容器服务存储库),我想看看它的代码。

  1. 首先,我们需要将您要访问的repo保存为tar文件。在我的例子中,命令是-docker保存.dkr.ecr.us-east-1.amazonaws.com/<;name_of_repo>: Image-tag>saved-repo.tar
  2. UNTAR文件使用命令-tar-xvfsaved-repo.tar.你可以看到许多文件夹和文件
  3. 现在尝试找到包含您要查找的代码的文件(如果您知道代码的某些部分) 搜索文件的命令-grep-iRl“要搜索的字符串”。/

这将使您到达该文件。甚至该文件也可能被涂上焦油,因此使用步骤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=your_image 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映像的内容非常有帮助。