如何基于Docker镜像逆向生成Dockerfile( 二 )

使用Dive工具实现Dive 是一个用于探索 Docker 镜像、层内容,并发现缩小 Docker/OCI 镜像大小的方法的工具 。

如何基于Docker镜像逆向生成Dockerfile

文章插图
图片
Dive 是一个用于探索 Docker 镜像、层内容 , 并发现可以减小镜像大小的方法的工具 。它提供了对每个层内容的详细分解,包括文件大小、权限等 。特别适用于识别可以删除以减小镜像大小的不必要文件或依赖项 。
特点:
  • 详细的层内容分解:Dive 提供了对 Docker 或 OCI 镜像中每个层内容的详细分解 。它显示每个文件的大小、权限和其他元数据 。
  • 色彩编码界面:Dive 使用色彩编码界面突出显示不同类型的文件 。这使得识别并删除不必要的文件或依赖项变得容易 。
  • 交互式探索:Dive 允许您交互式地探索每个层的内容 。您可以浏览各个层、查看单个文件,并进行更改以优化您的镜像 。
  • 优化建议:Dive 提供了优化镜像的建议 。它识别大文件、不必要的依赖项和其他潜在的优化方案 。
使用方法:
要使用 Dive,您需要在系统上安装它,并针对一个 Docker 或 OCI 镜像运行它:
dive <imageID>例如 , 要分析官方的 Alpine linux 镜像,您可以运行:
dive alpine:latest【如何基于Docker镜像逆向生成Dockerfile】然后 Dive 将显示镜像层的详细分解,让您可以探索每个层的内容并识别潜在的优化 。
除了像 Dive 这样的第三方工具外 , 我们可以立即使用的工具是 docker history 。如果我们在示例1镜像上使用 docker history 命令,我们可以查看在 Dockerfile 中用来创建该镜像的条目 。
docker history Nginx因此,我们应该得到以下结果:
IMAGECREATEDCREATED BYSIZECOMMENT374e0127c1bc25 minutes ago/bin/sh -c #(nop) COPY file:aa717ff85b39d3ed…0B84acff3a555425 minutes ago/bin/sh -c #(nop) COPY file:2a949ad55eee33f6…0Ba9cc49948e4025 minutes ago/bin/sh -c #(nop) COPY file:e3c862873fa89cbf…0B请注意,CREATED BY 列中的所有内容都被截断了 。这些是通过 Bourne shell 传递的 Dockerfile 指令 。这些信息可能对重新创建我们的 Dockerfile 有用,尽管在这里被截断了 , 但我们也可以通过使用 --no-trunc 选项来查看所有内容:
$ docker history example1 --no-truncIMAGECREATEDCREATED BYSIZECOMMENTsha256:374e0127c1bc51bca9330c01a9956be163850162f3c9f3be0340bb142bc57d8129 minutes ago/bin/sh -c #(nop) COPY file:aa717ff85b39d3ed034eed42bc1186230cfca081010d9dde956468decdf8bf20 in /0Bsha256:84acff3a5554aea9a3a98549286347dd466d46db6aa7c2e13bb77f0012490cef29 minutes ago/bin/sh -c #(nop) COPY file:2a949ad55eee33f6191c82c4554fe83e069d84e9d9d8802f5584c34e79e5622c in /0Bsha256:a9cc49948e40d15166b06dab42ea0e388f9905dfdddee7092f9f291d481467fc29 minutes ago/bin/sh -c #(nop) COPY file:e3c862873fa89cbf2870e2afb7f411d5367d37a4aea01f2620f7314d3370edcc in /0B虽然这里包含一些有用的数据,但从命令行解析可能会有些挑战 。我们也可以使用 docker inspect 。
Dockerfile From Image (dfimage)类似于 docker history 命令的工作方式,Python 脚本可以使用 Docker 存储在每个镜像层旁边的元数据重新创建(近似地)用于生成镜像的 Dockerfile 。
https://Github.com/LanikSJ/dfimage
Python 脚本本身被打包为一个 Docker 镜像 , 这样就可以很容易地使用 Docker run 命令来执行:
docker run -v /var/run/docker.sock:/var/run/docker.sock dfimage ruby:latestruby:latest 参数是镜像名称和标签(可以是缩写形式或完整的镜像名称和标签) 。
由于该脚本与 Docker API 交互以查询各种镜像层的元数据,因此它需要访问 Docker API 套接字 。上面显示的 -v 标志使得 Docker 套接字在运行脚本的容器内可用 。
请注意,该脚本仅适用于存在于您本地镜像仓库中的镜像(即您在键入 docker images 时看到的内容) 。如果要为本地仓库中不存在的镜像生成 Dockerfile,则首先需要使用 docker pull 命令拉取该镜像 。
总结将 Docker 镜像逆向工程为 Dockerfile,或者称为“回溯 Docker 镜像”,是一种有用的技术,可以帮助理解和重新创建镜像的构建过程 。工具如 Dive 和 Dedockify 可以通过分析镜像层和元数据来生成相应的 Dockerfile,从而提供帮助 。




推荐阅读