繁体   English   中英

如何查看docker图片内容

[英]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

存在以下文件:

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

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

或者

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

在此处输入图像描述

https://github.com/wagoodman/dive

探索码头形象

  1. 找出里面有什么样的外壳bashsh ...

首先检查镜像: 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

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

在此处输入图像描述

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

docker image inspect image_id

这在 Docker 版本中有效:

DockerVersion": "18.05.0-ce"

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

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

https://anchore.com/opensource/

在 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),我想查看它的代码。

  1. 首先,我们需要将要访问的 repo 保存为 tar 文件。 在我的情况下,命令就像 - docker save .dkr.ecr.us-east-1.amazonaws.com/<name_of_repo>:image-tag > saved-repo.tar
  2. 使用命令tar -xvf saved-repo.tar 解压文件。 您可以看到许多文件夹和文件
  3. 现在尝试查找包含您要查找的代码的文件(如果您知道代码的某些部分) 用于搜索文件的命令 - grep -iRl "string you want to search" ./

这将使您到达文件。 甚至该文件也可能被压缩,因此请使用步骤 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM