当前位置:首页 > 数码 > 基于Docker镜像逆向生成Dockerfile (基于docker的毕业论文设计)

基于Docker镜像逆向生成Dockerfile (基于docker的毕业论文设计)

admin7个月前 (04-15)数码41

引言

你能否曾经遇到过一个想要经常使用的镜像,但却不可修正以顺应你的特定需求?或许你或许发现了一个青睐的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命令时存在的构建高低文。

基于docker的毕业论文设计

要经常使用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 来查看

创建完命名空间后,打开镜像仓库,创建镜像仓库,选择本地仓库

根据官方给的文档开始提交就可以,这里就不截图了

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Docker

“基于Docker镜像逆向生成Dockerfile (基于docker的毕业论文设计)” 的相关文章

减少40%的构建时间-通过优化Docker构建流程 (减少50%)

减少40%的构建时间-通过优化Docker构建流程 (减少50%)

简介 在很多公司中,我们都为产品中使用的所有组件构建镜像。随着时间的推移,其中一些镜像变得越来越大,我们的 CI 构建耗时也越来越长。我的目标是让 CI 构建不超过 5 分钟——差不多是喝杯...

Docker-上装置-如何在-Ubuntu (docker logs)

Docker-上装置-如何在-Ubuntu (docker logs)

经常使用象征着开启一个新的计算畛域,但假设你刚刚开局经常使用Docker,装置或许看起来是一项艰难的义务。 在Ubuntu上装置Docker有两种介绍的方法: 我将在本教程中探讨它们。...

Docker镜像-容器的交互及外部代码口头原理与通常 (docker logs)

Docker镜像-容器的交互及外部代码口头原理与通常 (docker logs)

作为一种盛行的容器技术,曾经成为现代运行程序开发和部署的关键工具。在Docker中,镜像是构建和运转容器的基础,而容器则是基于镜像创立的可口头实例。 Docker镜像与容器的交互...

Docker容器编排技术解析-深化了解容器治理和编排 (docker是干什么的)

Docker容器编排技术解析-深化了解容器治理和编排 (docker是干什么的)

一、容器编排引见 容器编排是现代云原生运行治理的外围,它触及在大规模的环境中智能化部署、治理、裁减和网络性能容器。随着微服务架构的兴起和运行的复杂性参与,容器编排成为了成功高效、牢靠和灵活服...

七个杀手级Docker命令 (找一本讲一个叫七个杀手的小说)

七个杀手级Docker命令 (找一本讲一个叫七个杀手的小说)

Docker 是一种容器平台,它使用操作系统级别的虚拟化技术来实现软件打包和容器化运行。凭借 Docker,开发人员可以将应用程序打包成容器,以便在任何 Docker 环境中轻松部署。 Do...

打包应用程序代码和依赖项的机制-Docker容器 (qt如何打包应用程序)

打包应用程序代码和依赖项的机制-Docker容器 (qt如何打包应用程序)

概述 容器通过将应用程序的代码和所有依赖项打包到一个独立的软件包中,实现了应用程序的快速部署和移植。Docker容器是此类容器的一种流行实现,它使应用程序能够在不同的计算环境中一...

Compose入门-Docker与Docker-监禁运行部署的有限后劲

Compose入门-Docker与Docker-监禁运行部署的有限后劲

今天给大家引见一项弱小而幽默的技艺,那就是经常使用和DockerCompose来监禁你的运行部署的威力!无论你是一名开发人员还是系统治理员,把握这个技艺都将为你的上班带来渺小的好处。 1....

24条Dockerfile及指令最佳通常

24条Dockerfile及指令最佳通常

构建缓存 在镜像的构建环节中,会依据Dockerfile指定的顺序口头每个指令。Dockerfile的每条指令都会将结果提交为新的镜像。而后,下一条指令基于上一条指令的镜像启动构建。...