逆向解析Docker镜像(image)中的Dockerfile的通用方法

      当从官网上下载下来的镜像有问题时,我们通常是无法去修改镜像的,一般也就通过启动容器,再次覆盖去修改问题,但对于有些比较大的问题,比方镜像的系统版本太老,通过commit容器的方式去修改镜像,就有些力不从心了,这时,如果可以把镜像的Dockerfile逆向出来,自己重做镜像,那就可以彻底解决问题。

          逆向Dockerfile,我们能想到的方式就是通过docker history 命令来做,但是docker history逆向出来的命令有个问题,对于COPY/ADD指令,我们不清楚当时拷贝了什么文件进入到镜像中,经过研究,可以用下面的思路来实现:

    

解析COPY/ADD指令中的文件整体思路(每个COPY/ADD都会产生一个layer):

1.通过镜像名获取最高层的imageID  (docker image inspect  imagId)

2.通过最高层ImageID算出各个layer的layerID (参考镜像的标准,GitHub上有)

3.通过ImageID于其父层关联,得到其命令,并与步骤2的layerID顺序绑定

4.解析tar-split.json.gz中的json得到每条指令对应的文件 (通过zcat解析)

Guess you like

Origin blog.csdn.net/lyj22/article/details/121086833