如何查看泊坞窗图像内容

pyl*_*arn 205 docker

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

Aym*_*ine 249

您可以使用该图像运行交互式shell容器,并浏览该图像所具有的任何内容.

例如:

docker run -it image_name sh

或者,如果您想了解图像是如何构建的,意味着其中的步骤Dockerfile,您可以:

docker image history --no-trunc image_name > image_history
Run Code Online (Sandbox Code Playgroud)

这些步骤将记录到image_history文件中.

  • 我正在尝试查看使用“ FROM暂存”创建的图像的内容,并且没有可用的外壳。还有其他查看内容的方法吗?我要查看的图像是门卫/门卫。 (4认同)
  • @JuanHernandez,是的,您可以按照 /sf/answers/2987405361/ 中的指示转储图像的全部内容。 (4认同)
  • 前两个解决方案不适用于没有外壳的图像。我想列出图像内容的确切原因是我在图像中找不到 shell 可执行文件... (3认同)
  • 有人可以看到图像的内容而不生成容器吗?还是我们可以假设所有人都是安全的,除非他们有权从中产生容器? (2认同)
  • 结合之前的“对于带有入口点的Windows容器”:docker run -it --entrypoint cmd <image_name>将起作用。 (2认同)
  • 这个答案并不好,因为它取决于图像内部是否有壳,但情况并非总是如此。如果您对独立检查每个图像层不感兴趣,那么“docker create”答案是该问题的最佳答案。 (2认同)

lar*_*sks 141

这里接受的答案是有问题的,因为无法保证图像具有任何类型的交互式shell.例如,无人驾驶飞机/无人驾驶飞机的图像包含在单个命令/drone,并且它有一个ENTRYPOINT为好,因此这将失败:

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        
Run Code Online (Sandbox Code Playgroud)

这将失败:

$ 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".
Run Code Online (Sandbox Code Playgroud)

这不是一种不常见的配置; 许多最小图像仅包含支持目标服务所需的二进制文件.幸运的是,有一些机制可以探索不依赖于图像内容的图像文件系统.最简单的可能是docker export命令,它将容器文件系统导出为tar存档.所以,启动一个容器(无论是否失败都无关紧要):

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        
Run Code Online (Sandbox Code Playgroud)

然后使用docker export将文件系统导出到tar:

$ docker export $(docker ps -lq) | tar tf -
Run Code Online (Sandbox Code Playgroud)

docker ps -lq意味着"给我最新的码头工人的身份".您可以使用显式容器名称或ID替换它.

  • 您还可以使用 out 参数,如“docker export $(docker ps -lq) -o foo.tar” (9认同)
  • 如果您像我一样,想知道 `tar tf -` 中的 `-` 是什么意思:它告诉 tar 要读取的“文件”(*f flag*)是 `stdin` (6认同)
  • 这个答案对确定给定时间容器内可能有什么很有帮助 (3认同)
  • 这应该是公认的答案。尽管它应该以正确的命令引导。 (3认同)
  • 这个答案是更正确的,并且对我有用,因为我想用外国建筑探索图像的内容,而我不能“仅仅运行”它 (2认同)
  • 这适用于容器,而不是图像。简单修复:`docker image save $IMAGE | 焦油-tf-`。逻辑是一样的:Docker需要组合层,较高层可以覆盖较低层的文件。 (2认同)

lge*_*man 54

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

__CODE__

  • 上面的第二行仅列出了文件系统内容。如果要以tar格式获取所有文件,可以将其替换为`docker export tmp _ $$> image-fs.tar`。 (7认同)
  • docker create 命令对我来说是错误的,并显示“未指定命令”。在末尾添加一个像“ls”这样的虚拟命令(即使该命令在容器启动时会失败)似乎可以工作。```docker create --name="tmp_$$" image:tag ls``` (7认同)
  • 如果容器中没有外壳,这也适用 (4认同)
  • @AlexeiMarinichenko,您可以使用“-o”参数来指定要写入的文件。例如 `docker export -oc:\temp\tmp_$$.tar tmp_$$`。 (3认同)
  • Windows 操作系统的第二行是什么?`docker 导出 tmp_$$ | tar t` 不起作用。 (2认同)

And*_*ong 34

docker save nginx > nginx.tar
tar -xvf nginx.tar
Run Code Online (Sandbox Code Playgroud)

存在以下文件:

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

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

要么

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

在此处输入图片说明

https://github.com/wagoodman/dive

  • 绝对同意@AlecThomas - 更进一步,为什么我需要“docker”来查看本质上只是不同类型的存档文件的内容。 (5认同)
  • 这对我来说似乎是最有用的答案,因为您不必启动容器来获取文件。 (4认同)
  • 好的答案,我还会指定标签:`docker save --output nginx.tar nginx:latest`,否则,根据文档,它将包含“所有父层,以及所有标签+版本” (3认同)
  • 这应该被赞成,因为如果你里面没有任何 Unix 实用程序,这可能是探索内部结构的唯一方法。而且这种方式不需要创建容器。 (2认同)

Kha*_*oui 19

探索码头工人形象

  1. 弄清楚那里有什么样的外壳bashsh......

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

在 JSON 返回中查找entrypointcmd

  1. 然后做: docker run --rm -it --entrypoint=/bin/bash name-of-image

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

-it代表互动......和TTY。在--rm运行后,表示删除的容器。

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

RUN apk add --no-cache bash
Run Code Online (Sandbox Code Playgroud)

当您无权访问时,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

Run Code Online (Sandbox Code Playgroud)

  • 这个答案的问题在于,正如已接受的答案中所讨论的,不能保证您的图像中包含*任何*外壳。或者“ls”。或者任何常用工具都可以。 (5认同)

小智 16

如果您想在不启动容器的情况下列出映像中的文件:

\n
docker create --name listfiles <image name>\ndocker export listfiles |\xc2\xa0tar -t\ndocker rm listfiles\n
Run Code Online (Sandbox Code Playgroud)\n


sar*_*eek 16

我尝试了这个工具 - https://github.com/wagoodman/dive 我发现它对于探索 docker 镜像的内容非常有帮助。

在此输入图像描述


Ser*_*nko 6

要列出您必须运行的图像的详细内容,docker run --rm image/name ls -alR其中--rm一旦从容器中退出就会删除.

在此输入图像描述

  • 假设图像具有`ls`且位于`PATH`中 (9认同)