docker image分析利器之dedockify

Dedockify 是一个用于逆向Docker 镜像并生成相应 Dockerfile 的工具。
它的主要功能是通过解析 Docker 镜像的metadata(也就是history),重建出用于生成该镜像的 Dockerfile。

开源仓库地址: https://github.com/mrhavens/Dedockify

主要功能

  1. 逆向工程 Docker 镜像:Dedockify 能够从 Docker 镜像中提取信息,并生成一个近似的 Dockerfile。这对于需要了解镜像构建过程或修改镜像的用户非常有用。
  2. 使用 Docker API:Dedockify 利用 Python Docker API 与 Docker 交互,获取镜像的各层信息,并将这些信息重新格式化为 Dockerfile。
  3. 支持本地镜像:该工具只能对本地存在的 Docker 镜像进行操作。如果镜像不在本地仓库中,需要先使用 docker pull 命令将其拉取下来。

使用方法

基本用法

  1. 拉取 Dedockify 镜像

    docker pull mrhavens/dedockify
    
  2. 创建别名

    alias dedockify="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm mrhavens/dedockify"
    
  3. 生成 Dockerfile

    dedockify <imageID>
    

    其中 <imageID> 是目标 Docker 镜像的 ID,可以是截断形式或完整形式。

⚠️注意因为docker daemon版本和docker python sdk版本的兼容问题, 当前官方repo的代码在某些情况下已经无法工作。下面笔者给出一个fix:

首先需要安装最新的docker python sdk:

pip install docker

然后修改dedockify.py为如下:

#!/usr/bin/python3from sys import argv
import docker
import docker.errorsclass ImageNotFound(Exception):passclass MainObj:def __init__(self):super(MainObj, self).__init__()self.commands = []self.cli = docker.client.from_env()self._get_image(argv[-1])self.hist = self.img.history()self._parse_history()self.commands.reverse()self._print_commands()def _print_commands(self):for i in self.commands:print(i)def _get_image(self, img_hash):try:img = self.cli.images.get(img_hash)self.img = imgexcept docker.errors.ImageNotFound:raise ImageNotFound("Image {} not found".format(img_hash))def _insert_step(self, step):if "#(nop)" in step:to_add = step.split("#(nop) ")[1]else:to_add = ("RUN {}".format(step))to_add = to_add.replace("&&", "\\\n    &&")self.commands.append(to_add.strip(' '))def _parse_history(self, rec=False):first_tag = Falseactual_tag = Falsefor i in self.hist:if i['Tags']:actual_tag = i['Tags'][0]if first_tag and not rec:breakfirst_tag = Trueself._insert_step(i['CreatedBy'])if not rec:self.commands.append("FROM {}".format(actual_tag))__main__ = MainObj()

如果docker build过程中遇到速度很慢的问题,可以通过修改apk源和pip源解决,下面是一个修改后的例子:

FROM alpine:3.11.3RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositoriesRUN apk --no-cache update && apk add --no-cache python3 wget \&& wget -q --no-check-certificate https://bootstrap.pypa.io/get-pip.py \&& apk del wget && python3 get-pip.py && rm -f get-pip.py \&& pip install -U docker pip -i https://pypi.tuna.tsinghua.edu.cn/simple && yes | pip uninstall pipRUN mkdir /app
COPY entrypoint.sh /.
COPY dedockify.py /app/.ENTRYPOINT ["/entrypoint.sh"]

修改后的完整代码可以从笔者的fork中获取:https://github.com/merthmagic/Dedockify

示例

以下是一个使用 Dedockify 生成 Dockerfile 的示例:

## ⚠️ 如果不能工作,请用上面的更新后代码自行打包docker image
$ docker pull mrhavens/dedockify
$ alias dedockify="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm mrhavens/dedockify"
$ dedockify <imageID>

生成的 Dockerfile 可能如下所示:

FROM buildpack-deps:latest
RUN useradd -g users user
RUN apt-get update && apt-get install -y bison procps
RUN apt-get update && apt-get install -y ruby
ADD dir:03090a5fdc5feb8b4f1d6a69214c37b5f6d653f5185cddb6bf7fd71e6ded561c in /usr/src/ruby
WORKDIR /usr/src/ruby
RUN chown -R user:users .
USER user
RUN autoconf && ./configure --disable-install-doc
RUN make -j"$(nproc)"
RUN make check
USER root
RUN apt-get purge -y ruby
RUN make install
RUN echo 'gem: --no-rdoc --no-ri' >> /.gemrc
RUN gem install bundler
ONBUILD ADD . /usr/src/app
ONBUILD WORKDIR /usr/src/app
ONBUILD RUN [ ! -e Gemfile ] || bundle install --system

限制

Dedockify 目前有一些限制,例如它无法处理所有类型的指令,特别是涉及复杂文件操作的指令。此外,未来的改进方向包括自动恢复容器中的文件并将其存储到本地,以及更好地推断基础镜像等。

但总的来说,Dedockify 是一个强大的工具,通过Dedockify再配合一些后续处理,能够帮助开发者和运维人员更好地理解和管理 Docker 镜像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CISCN 2023 初赛 被加密的生产流量

题目附件给了 modbus.pcap 存在多个协议 但是这道题多半是 考 modbus 会发现 每次的 Query 末尾的两个字符 存在规律 猜测是base家族 可以尝试提取流量中的数据 其中Word Count字段中的22871 是10进制转16进制在转ascii字符串 先提取 过滤器判断字段 tshark -r modbus.pcap …

jenkins插件之plot

plot是一个生成图表的插件&#xff0c;这里我用于可视化phploc统计的数据 插件安装 进入 Dashboard --> 系统管理 --> 插件管理 --> Available plugins 搜索plot安装生成phploc分析数据 Dashboard --> 您的项目 --> Configuration点击 Build Steps点击 增加构…

振弦采集仪在岩土工程固结沉降监测中的应用研究

振弦采集仪在岩土工程固结沉降监测中的应用研究 岩土工程固结沉降是指土体在受到外力作用下&#xff0c;由于土体颗粒之间的重排结构&#xff0c;导致土体体积缩小和沉降的过程。固结沉降的监测对于岩土工程的设计和施工具有重要的意义&#xff0c;而振弦采集仪作为一种先进的…

物联网——TIM定时器、PWM驱动呼吸灯、舵机和直流电机

定时器概念&#xff08;常用于输出PWM波形&#xff0c;驱动电机&#xff09; 时间脉冲数时钟周期&#xff1b; 这里的脉冲数6553665536&#xff0c;支持定时器级联&#xff0c;从而延长定时 定时器类型 基本定时器原理图&#xff08;UI:更新中断&#xff0c; U:更新事件&#…

入门flask:Python后端开发的首选框架

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;从零开始学习弗拉斯克 二、弗拉斯克的微框架哲学 三、弗拉斯克的核心…

知识维权维权不是低价治理的唯一方法

控价对于品牌来说确实是一个重要的环节&#xff0c;它旨在维护品牌形象和市场秩序&#xff0c;防止渠道出现低价、窜货等不正当竞争行为。整个控价过程确实需要包括前期的数据监测、治理动作以及后期的数据分析&#xff0c;以确保控价的全面性和有效性。 在治理低价链接方面&a…

kali自带--DNS路由--信息搜集

目录 DNS信息搜集 whois fierce dnsenum 路由信息搜集 DNS信息搜集 whois whois 域名 --域名注册的时候填的基本信息. fierce 域名的多级域名? 搜索引擎-谷歌搜索 whois 枚举/递归查询 dnsenum dnsenum 域名 -f 文件名 路由信息搜集 icmp经常ping不通--所以kali出了个tcp的…

Pytorch 叶子节点和非叶子节点的理解

1.为什么要区分叶子节点和非叶子节点&#xff1f; 为了节省内存。在pytorch的计算图里只有两种元素&#xff1a;数据&#xff08;tensor&#xff09;和 运算&#xff08;operation&#xff09;。其中数据可分为&#xff1a;叶子节点&#xff08;leaf node&#xff09;和非叶子…

vue 笔记03

目录 01 vue 对象本身的属性和方法 02 computed计算属性的使用 03 filter过滤器的使用 04 使用key属性管理重复元素(虚拟dom原理) 05 MVC 和 MVVM 06 双向数据绑定原理 01 vue 对象本身的属性和方法 vue构造函数传入的是options对象 可以通过vue对象的$option获取 vm.$op…

【稳定检索/投稿优惠】2024年语言、文化与艺术发展国际会议(LCAD 2024)

2024 International Conference on Language, Culture, and Art Development 2024年语言、文化与艺术发展国际会议 【会议信息】 会议简称&#xff1a;LCAD 2024大会时间&#xff1a;2024-08-10截稿时间&#xff1a;2024-07-27(以官网为准&#xff09;大会地点&#xff1a;中国…

Rainbond 携手 TOPIAM 打造企业级云原生身份管控新体验

TOPIAM 企业数字身份管控平台&#xff0c; 是一个开源的IDaas/IAM平台、用于管理账号、权限、身份认证、应用访问&#xff0c;帮助整合部署在本地或云端的内部办公系统、业务系统及三方 SaaS 系统的所有身份&#xff0c;实现一个账号打通所有应用的服务。 传统企业 IT 采用烟囱…

纯C++做多项式拟合

一、多项式拟合用途 当前有一组对应的x、y数据&#xff0c;希望通过这些数据点做出近似的多项式曲线&#xff1a;YnX^2mXc 其中多项式最高次数可调&#xff0c;返回各个参数及曲线的拟合度R^2 二、函数实现 参数中的order为设置的多项式最高次次数&#xff0c;coefficients为…

源码编译安装LNMP

1、LNMP 包含&#xff1a;linux、Nginx、Mysql、php LNMP的工作原理 由客户端发送页面请求给Nginx&#xff0c;Nginx会根据location匹配用户访问请求的URL路径判断是静态还是动态&#xff0c;静态的一般是以 .html .htm .css .shtml结尾&#xff0c;动态的一般是以 .php .jsp…

17.js字符串

字符串创建 1.字面量创建 var 字符串名字符串 2.内部构造函数创建 var 字符串名new String(字符串) length属性 只能读取不能设置 var strabcdfegfglconsole.log(str.length) //10str.length5 console.log(str) //不能写 abcdfegfgl index属性 只能读不能设置 var strab…

水位监测站的工作原理

TH-SW2在雨季&#xff0c;河道和湖泊的水文信息监测对于防洪减灾、水资源管理和环境保护等方面具有至关重要的意义。水文监测站作为实现这一目标的基础设施&#xff0c;发挥着关键作用。水文监测站是观测及搜集河流、湖泊、水库等水体的水文、气象资料的基层水文机构。在雨季&a…

C++基础项目 通讯录管理系统

尝试找实习面试,结果发现自己的学习还有很多不足,没有了解c11/14很多新特性的使用以及学习,因此打算重新过一遍基础.通讯录管理系统是c的基础入门,主要运用了结构体,数组,函数以及指针等东西.下面详细的说明整个设计工程. 需求分析 * 联系人上限为1000人&#xff0c;联系人信息…

harbor -- docker私有仓库安装配置

1 安装docker-compose $ curl -L "https://get.daocloud.io/docker/compose/releases/download/v1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ chmod x /usr/local/bin/docker-compose 2 安装配置harbor $ wget https://g…

代码随想录算法训练营第36天 | 738.单调递增的数字

代码随想录算法训练营第36天 | 738.单调递增的数字 自己看到题目的第一想法看完代码随想录之后的想法自己实现过程中遇到哪些困难 ) 链接: 738.单调递增的数字 自己看到题目的第一想法 738.单调递增的数字&#xff1a;先判断本身是否单调递增&#xff0c;如果是就直接返回该…

Android NDK系列(五)内存监控

在日常的开发中&#xff0c;内存泄漏是一种比较比较棘手的问题&#xff0c;这是由于其具有隐蔽性&#xff0c;即使发生了泄漏&#xff0c;很难检测到并且不好定位到哪里导致的泄漏。如果程序在运行的过程中不断出现内存泄漏&#xff0c;那么越来越多的内存得不到释放&#xff0…

centos时间不对

检查当前时区是否正确 timedatectl status如果时区不正确&#xff0c;使用以下命令设置正确的时区&#xff08;将Asia/Shanghai替换为您所在的时区&#xff09;&#xff1a; timedatectl set-timezone Asia/Shanghai如果时区正确但时间不准确&#xff0c;使用以下命令同步网络…