博客
关于我
一次 Docker 镜像的逆向工程 | Linux 中国
阅读量:310 次
发布时间:2019-03-03

本文共 1818 字,大约阅读时间需要 6 分钟。

Docker 镜像的结构揭秘:如何从镜像中提取构建信息

在我们的项目中,经常需要处理一些与 Docker 镜像相关的技术问题。一次典型的案例是,我们需要重新构建一个遗失的 Docker 镜像。这个镜像最初是由外包开发人员构建的,但他没有提交原始的 Dockerfile。面对这一挑战,我们决定从镜像文件中提取尽可能多的信息。

Docker 镜像的格式其实非常透明。只要对镜像文件进行解析,我们就可以揭开许多谜团。以下将详细介绍我们是如何从镜像中提取构建信息的。

第一步:提取镜像文件

首先,我们需要将 Docker 镜像保存到本地文件中。可以通过以下命令实现:

docker pull tmknom/prettier:2.0.5docker save tmknom/prettier:2.0.5 > prettier.tar

这个文件是一个典型的 tarball 形式,包含镜像的所有构建信息。接下来,我们可以解压这个 tarball 文件来进一步分析。

第二步:解析镜像文件

解压后的文件结构看起来像是一个层级性的目录树。每个子目录都对应镜像中的一层。例如,以下是解压后的部分内容:

6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70/layer.tard4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4/layer.tara9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97/layer.tar

每个层都有一个唯一的哈希值,这使得我们能够精确追踪每一层的构建信息。

第三步:分析构建历史

镜像的构建历史记录在 history 文件中。这个文件详细列出了镜像的每一层及其构建时间。例如:

{  "created": "2020-04-24T01:05:03.608058404Z",  "created_by": "/bin/sh -c #(nop) ADD file:b91adb67b670d3a6ff9463e48b7def903ed516be66fc4282d22c53e41512be49 in / "},{  "created": "2020-04-24T01:05:03.92860976Z",  "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/sh\"]",  "empty_layer": true},...

从这些信息中,我们可以看到镜像的构建时间和构建命令。这对于重建镜像非常有帮助。

第四步:重建 Dockerfile

通过分析镜像的构建历史,我们可以大致重建原始的 Dockerfile。例如,以下是从镜像中提取的一部分构建信息:

FROM alpine:3.11.6WORKDIR /workENTRYPOINT /usr/bin/prettierCMD --help

这些信息帮助我们了解镜像的基础构建环境。通过进一步分析,我们可以发现镜像主要基于 Alpine 系统,并包含了一系列与 Node.js 和 Prettier 相关的依赖项。

第五步:验证镜像的合理性

在分析镜像的构建信息的过程中,我们发现镜像中包含了多个非空层。例如:

  • 基础系统镜像
  • Prettier 安装所需的依赖项
  • 工作目录的定义
  • 通过对这些层的进一步分析,我们可以验证镜像的合理性。例如,基础镜像确实包含了必要的系统工具,而 Prettier 镜像则包含了所有相关的安装脚本和依赖项。

    第六步:总结经验

    通过这一系列的分析和重建过程,我们得出了以下几个关键结论:

  • Docker 镜像的构建过程可以通过镜像文件的解析来追溯
  • 镜像的构建信息可以通过 history 文件和各层的 tarball 文件来提取
  • 即使没有原始的 Dockerfile,我们仍然可以通过镜像文件重建出一个基本的构建流程
  • 在实际项目中,建立一个清晰的镜像构建记录是至关重要的
  • 结语

    通过对 Docker 镜像的深入分析,我们不仅能够理解镜像的构建过程,还可以利用这些信息来优化和重建镜像。虽然这需要一定的技术门径,但对于需要维护和扩展现有镜像的项目来说,这无疑是一个非常有价值的能力。

    转载地址:http://swxl.baihongyu.com/

    你可能感兴趣的文章
    Python关于numpy.transpose函数详细解析附代码
    查看>>
    Python3导入自定义模块的3种方式
    查看>>
    python3打开txt文件_使用Python 3从文本文件读取句子并添加到列表中
    查看>>
    python3爬虫抓取智联招聘职位信息代码
    查看>>
    Python3爬虫数据入数据库---把爬取到的数据存到数据库,带数据库去重功能
    查看>>
    python3的 pymysql把mysqldb库取代了,让python 3支持mysqldb的解决方法
    查看>>
    Python3笔记——IDE的选择
    查看>>
    python3简单使用requests 用户代理,cookie池
    查看>>
    Python3组播通信编程实现教程(发送者+接收者)
    查看>>
    Python3编写网络爬虫10-数据存储方式三-CSV文件存储
    查看>>
    python3读取redis返回数据带有'b'的问题
    查看>>
    Python3连接MySQL
    查看>>
    Python关于isinstance函数的解析 | 附Demo(全)
    查看>>
    Python3:setup.py:完成所有任务的PIP安装(Build_ext+Install)
    查看>>
    python4.0 gil_Python 并发编程系列--1、浅谈GIL历史及对多线程的影响
    查看>>
    python60行绘图程序_天底下最简单的QT画图板,就一个类,60行代码
    查看>>
    Python: AES加密与解密
    查看>>
    Python: Range() 最大尺寸;动态的还是静态的?
    查看>>
    Python: Windows下用 multiprocessing 的深坑
    查看>>
    python:Could not find platform independent libraries <prefix>解决方法
    查看>>