Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查看docker图像内容_Docker - Fatal编程技术网

如何查看docker图像内容

如何查看docker图像内容,docker,Docker,我做了一个docker拉,可以列出下载的图像。我想看看这张图片的内容。在网上搜索,但没有直接的答案。您可以使用该图像运行一个交互式shell容器,并浏览该图像包含的任何内容 例如: docker run -it image_name sh 或以下带有入口点的图像 docker run -it --entrypoint sh image_name 或者,如果您想查看映像是如何生成的,即其Dockerfile中的步骤,您可以: docker image history --no-trunc im

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

您可以使用该图像运行一个交互式shell容器,并浏览该图像包含的任何内容

例如:

docker run -it image_name sh
或以下带有
入口点的图像

docker run -it --entrypoint sh image_name
或者,如果您想查看映像是如何生成的,即其
Dockerfile
中的步骤,您可以:

docker image history --no-trunc image_name > image_history

这些步骤将被记录到
image\u history
文件中。

此处接受的答案有问题,因为无法保证图像将具有任何类型的交互式外壳。例如,图像包含单个命令
/drone
,并且它也有一个
入口点
,因此此操作将失败:

$ 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 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 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容器的所有内容

无需特殊安装


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

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

docker image inspect image_id
这在Docker版本中有效:

DockerVersion": "18.05.0-ce"

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

存在以下文件:

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

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


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

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


探索码头工人形象

  • 弄清楚里面有什么样的外壳
    bash
    sh
  • 首先检查图像:
    docker检查容器名称或图像

    在JSON返回中查找
    entrypoint
    cmd

  • 然后执行:
    dockerrun--rm-it--entrypoint=/bin/bash图像名称
  • 一旦进入do:
    ls-lsa
    或任何其他shell命令,如:
    cd..

    -it
    代表交互式。。。还有TTY。
    --rm
    代表运行后移除容器

    如果没有像
    ls
    bash
    这样的常用工具,并且您可以访问
    Dockerfile
    simple,则将常用工具添加为一个层。
    示例(alpine Linux):

    当您无法访问
    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 create#返回从未启动过的容器ID。
    docker cp:
    码头工人室
    cd&ls-lsah
    
    我试图查看使用“从头开始”创建的图像的内容,但没有可用的shell。有没有其他方式查看内容?我尝试查看的图像是portainer/portainer。是否有人可以在不生成容器的情况下查看图像的内容?或者我们可以假设它是安全的,除非他们有权从中生成一个容器?结合前面所说的“对于带有入口点的windows容器”:
    docker run-it--entrypoint cmd
    可以工作。@JuanHernandez,是的,您可以如中所示转储图像的全部内容。此答案不太好,因为它取决于图像中是否有外壳,但情况并非总是如此。如果您对独立检查每个图像层不感兴趣,则docker create答案是该问题的最佳答案。可能的重复不是重复。查看容器和图像不是一回事。在映像有机会运行之前,您可能希望查看初始文件系统,甚至验证映像内部是否没有恶意。如果无法将映像作为容器运行,则可以使用类似于drive()的工具,或者使用docker save将映像导出为tar文件。然后,您可以浏览tar或使用dive,您可以尽快浏览图像。不是重复,但您可以在此处找到答案:这假设图像具有可用的
    ls
    ,并且在
    路径中,这不显示内容;它只显示用于构建图像的层等。这似乎是对我最有用的答案,因为你不必启动容器来获取文件。绝对同意@AlecThomas-而且更进一步,为什么我甚至需要
    docker
    来查看内容
    RUN apk add --no-cache bash
    
    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