基于Docker镜像逆向生成Dockerfile (基于docker的毕业论文设计)
引言
你能否曾经遇到过一个想要经常使用的镜像,但却不可修正以顺应你的特定需求?或许你或许发现了一个青睐的Docker镜像,但想要了解它是如何构建的?在这两种状况下,将Docker镜像逆向生成一个Dockerfile可以经常使用一些工具来成功。
将Docker镜像转换为Dockerfile象征着失掉现有的Docker镜像,并经常使用它来创立一个你可以修正和控制的Dockerfile。
这个环节让你能够了解Docker镜像的外部运作方式,启动修正,降级镜像以在不同平台上运转,或许依据特定需求对其启动优化。
在这篇博客文章中,咱们将经过经常使用一些开源工具,率领您逐渐解读Docker镜像并转换为Dockerfile的环节。
经常使用Dedockify工具成功
图片
Docker镜像就像黑匣子,蕴含了在镜像构建环节中口头的一系列指令层。
如今有了Dedockify,一个经常使用/target=_blankclass=infotextkey>Python脚本的工具,可以协助重建创立镜像所经常使用的Dockerfile的近似版本。
Dedockify的上班原理是应用存储在每个镜像层旁边的元数据。它经过沿着层级树向后遍历,搜集与每个层关系联的命令。
这个环节使它能够重建在镜像构建环节中口头的命令序列。
但是,有一个疑问:假设经常使用了COPY或ADD指令,Dedockify生成的输入不会齐全婚配原始的Dockerfile。这是由于Dedockify不可访问在口头原始的dockerbuild命令时存在的构建高低文。
要经常使用Dedockify,可以将其作为一个Docker容器运转:
dockerrun-v/var/run/docker.sock:/var/run/docker.sockdedockify<imageID>
参数<imageID>是镜像ID(可以是缩短方式或完整的镜像ID)。
上班原理是什么?
当从Dockerfile构建镜像时,Dockerfile中的每个指令都会生成一个新的层。您可以经常使用dockerimages命令和(如今已弃用的)--tree标记来检查一切的镜像层。
$dockerimages--treeWarning:'--tree'isdeprecated,itwillberemovedsoon.Seeusage.└─511136ea3c5aVirtualSize:0BTags:scratch:latest└─1e8abad02296VirtualSize:121.8MB└─f106b5d7508aVirtualSize:121.8MB└─0ae4b97648dbVirtualSize:690.2MB└─a2df34bb17f4VirtualSize:808.3MBTags:buildpack-deps:latest└─86258af941f7VirtualSize:808.6MB└─1dc22fbdefefVirtualSize:846.7MB└─00227c86ea87VirtualSize:863.7MB└─564e6df9f1e2VirtualSize:1.009GB└─55a2d383d743VirtualSize:1.009GB└─367e535883e4VirtualSize:1.154GB└─a47bb557ed2aVirtualSize:1.154GB└─0d4496202bc0VirtualSize:1.157GB└─5db44b586412VirtualSize:1.446GB└─bef6f00c8d6dVirtualSize:1.451GB└─5f9bee597a47VirtualSize:1.451GB└─bb98b84e0658VirtualSize:1.452GB└─6556c531b6c1VirtualSize:1.552GB└─569e14fd7575VirtualSize:1.552GB└─fc3a205ba3deVirtualSize:1.555GB└─5fd3b530d269VirtualSize:1.555GB└─6bdb3289ca8bVirtualSize:1.555GB└─011aa33ba92bVirtualSize:1.555GBTags:ruby:2,ruby:2.1,ruby:2.1.1,ruby:latest
这些层中的每一个都是在Dockerfile中口头指令的结果。理想上,假设您对这些层中的任何一个口头dockerinspect,您可以看到用于生成该层的指令。
$dockerinspect011aa33ba92b[{..."ContnerConfig":{"Cmd":["/bin/sh","-c","#(nop)ONBUILDRUN[!-eGemfile]||bundleinstall--system"],...}]
Docker示例:
以下是一个示例,展现了如何拉取官网的DockerRuby镜像并生成该镜像的Dockerfile。
$dockerpullmrhavens/dedockifyUsingdefaulttag:latestlatest:Pullingfromdedockify$alias$dedockify<imageID>FROMbuildpack-deps:latestRUNuseradd-gusersuserRUNapt-getupdate&&apt-getinstall-ybisonprocpsRUNapt-getupdate&&apt-getinstall-yrubyADDdir:03090a5fdc5feb8b4f1d6a69214c37b5f6d653f5185cddb6bf7fd71e6ded561cin/usr/src/rubyWORKDIR/usr/src/rubyRUNchown-Ruser:users.USERuserRUNautoconf&&./configure--disable-install-docRUNmake-j"$(nproc)"RUNmakecheckUSERrootRUNapt-getpurge-yrubyRUNmakeinstallRUNecho'gem:--no-rdoc--no-ri'>>/.gemrcRUNgeminstallbundlerONBUILDADD./usr/src/ONBUILDWORKDIR/usr/src/appONBUILDRUN[!-eGemfile]||bundleinstall--system
经常使用Dive工具成功
Dive是一个用于探求Docker镜像、层内容,并发现增加Docker/OCI镜像大小的方法的工具。
图片
Dive是一个用于探求Docker镜像、层内容,并发现可以减小镜像大小的方法的工具。它提供了对每个层内容的具体合成,包括文件大小、权限等。特意实用于识别可以删除以减小镜像大小的不用要文件或依赖项。
特点:
经常使用方法:
要经常使用Dive,您须要在系统上装置它,并针对一个Docker或OCI镜像运转它:
例如,要剖析官网的Alpine镜像,您可以运转:
divealpine:latest
而后Dive将显示镜像层的具体合成,让您可以探求每个层的内容并识别潜在的优化。
除了像Dive这样的第三方工具外,咱们可以立刻便用的工具是dockerhistory。假设咱们在示例1镜像上经常使用dockerhistory命令,咱们可以检查在Dockerfile中用来创立该镜像的条目。
dockerhistory
因此,咱们应该失掉以下结果:
IMAGECREATEDCREATEDBYSIZECOMMENT374e0127c1bc25minutesago/bin/sh-c#(nop)COPYfile:aa717ff85b39d3ed…0B84acff3a555425minutesago/bin/sh-c#(nop)COPYfile:2a949ad55eee33f6…0Ba9cc49948e4025minutesago/bin/sh-c#(nop)COPYfile:e3c862873fa89cbf…0B
请留意,CREATEDBY列中的一切内容都被截断了。这些是经过Bourneshell传递的Dockerfile指令。这些消息或许对从新创立咱们的Dockerfile有用,虽然在这里被截断了,但咱们也可以经过经常使用--no-trunc选项来检查一切内容:
$dockerhistoryexample1--no-truncIMAGECREATEDCREATEDBYSIZECOMMENTsha256:374e0127c1bc51bca9330c01a9956be163850162f3c9f3be0340bb142bc57d8129minutesago/bin/sh-c#(nop)COPYfile:aa717ff85b39d3ed034eed42bc1186230cfca081010d9dde956468decdf8bf20in/0Bsha256:84acff3a5554aea9a3a98549286347dd466d46db6aa7c2e13bb77f0012490cef29minutesago/bin/sh-c#(nop)COPYfile:2a949ad55eee33f6191c82c4554fe83e069d84e9d9d8802f5584c34e79e5622cin/0Bsha256:a9cc49948e40d15166b06dab42ea0e388f9905dfdddee7092f9f291d481467fc29minutesago/bin/sh-c#(nop)COPYfile:e3c862873fa89cbf2870e2afb7f411d5367d37a4aea01f2620f7314d3370edccin/0B
虽然这里蕴含一些有用的数据,但从命令行解析或许会有些应战。咱们也可以经常使用dockerinspect。
DockerfileFromImage(dfimage)
相似于dockerhistory命令的上班方式,Python脚本可以经常使用Docker存储在每个镜像层旁边的元数据从新创立(近似地)用于生成镜像的Dockerfile。
Python脚本自身被打包为一个Docker镜像,这样就可以很容易地经常使用Dockerrun命令来口头:
dockerrun-v/var/run/docker.sock:/var/run/docker.sockdfimageruby:latest
ruby:latest参数是镜像称号和标签(可以是缩写方式或完整的镜像称号和标签)。
由于该脚本与DockerAPI交互以查问各种镜像层的元数据,因此它须要访问DockerAPI套接字。上方显示的-v标记使得Docker套接字在运转脚本的容器内可用。
请留意,该脚本仅实用于存在于您本地镜像仓库中的镜像(即您在键入dockerimages时看到的内容)。假设要为本地仓库中不存在的镜像生成Dockerfile,则首先须要经常使用dockerpull命令拉取该镜像。
总结
将Docker镜像逆向工程为Dockerfile,或许称为回溯Docker镜像,是一种有用的技术,可以协助了解和从新创立镜像的构建环节。工具如Dive和Dedockify可以经过剖析镜像层和元数据来生成相应的Dockerfile,从而提供协助。
如何通过vs2017的Dockerfile来生成镜像
如何通过dockerhistory命令来对docker镜像进行反向工程推测它们的Dockerfile,从而在对不同的Docker镜像反向工程获取Dockerfile之后合并成一个。 常言道,“不要重复发明轮子!”在使用docker时,最好在构建你自己的镜像前上DockerHub寻找一些直接可以用的。 把你的软件架构分布到一系列容器中,每一个容器只做一件事情是非常有用的。 构建分布式应用的最好的基石是使用来自DockerHub的官方镜像,因为你可以信任它们的质量。 在某些情况下,你可能想让一个容器做两件不同的事情。 在另一些情况下,你可能想让一个Docker镜像包含来自两个不同镜像的依赖。 如果你有每个镜像的Dockerfile,这是非常简单的。 将它们组织到一个Dockerfile里然后build即可。 但是,如果大多数时间你都在使用DockerHub上准备好的镜像,你将没有它们的源Dockerfile。 我花了一些时间来找这样一个工具,它可以合并(或flatten)两个不同的我没有它们的Dockerfile的Docker镜像。 即我在找一个能做下面这件事的东西:image1--\--->merged_image_12/image2--尽管这个问题在之前的两个进程中被关闭了(1,2),当你想这么做时,这个问题仍然会产生。
DockeFIile知识点总结和发布自己的镜像
的基本定义
2. dockerfile 的基本结构
3. dockerfile 的常用指令
FROM :指定基础镜像,必须是第一个命令
MAINTAINER :维护者信息
RUN :构建镜像时执行的命令
ADD :将本地文件添加到容器中
COPY 功能和 ADD 类似,区别如下
CMD :构建容器这后使用
ENTRYPOINT :配置容器,与CMD类似
LABEL :用于为镜像添加元数据
ENV :设置环境变量
EXPOSE :指定与外界交互的端口
VOLUME :用于指定持久化目录
WORKDIR :工作目录,类似于 CD 命令
USER :指定运行容器时的用户名或UID,后面的RUN也会使用指定用户,当服务不需要管理员权限时,可以通过该命令指定运行用户
ARG :用于指定传递给构建运行时的变量
ONBUILD :用于设置镜像触发器
编写dockerfile文件
通过dockerfile构建镜像
查看镜像构建的过程,可以使用 docker history 镜像id 来查看
创建完命名空间后,打开镜像仓库,创建镜像仓库,选择本地仓库
根据官方给的文档开始提交就可以,这里就不截图了
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。