上云原生之后不可避免的要操作docker镜像,打镜像之前需要编写dockerfile,但是有时候我们需要根据已有的镜像还原回dockerfile.
我们可以使用命令 docker save [镜像id] > ~/image.tar 或 docker save [镜像name:version] > ~/image.tar,区别在于前者用[镜像id]导出来的镜像没有携带 tag信息,需要手动指定!
对于已经保存的镜像,可以使用 tar -xf image.tar 解开,如下图:
可以看到有一个manifest.json说明文件、一个*.json文件和很多 文件夹,这里的文件夹就是镜像的非空层(注意这里是非空层)
我们打开manifest.json说明文件,可以看到 layers(对应解压缩出来非空层),RepoTags(镜像的tag),Config对应打镜像的一些配置文件(*.json)
我们打开这个*.json文件:
可以看到
config:是我们打镜像时候形成的一些配置,比如开放端口 ExposedPorts,环境变量Env等
history:就是我们打镜像过程中全部层(包含非空层 和 空层),这里的空层有字段 "empty_layer": true 标示,表示该层存在,但是不占镜像空间!
举个例子:
如果你执行 RUN script.sh 命令创建了 really_big_file,然后用 RUN rm really_big_file 命令删除文件,Docker 镜像实际生成两层:一个包含 really_big_file,一个包含 .wh.really_big_file 记录来删除它。整个镜像文件大小不变。
这就是为什么会经常看到像 RUN script.sh && rm really_big_file 这样的 Dockerfile 命令链接在一起——它保障所有更改都合并到一层中。
根据history说明我们基本可以还原 dockerfile文件,但是对于 From Copy等操作不能还原,对于From操作,我们可以 tar -tf layer.tar(第一层镜像压缩文件) 查看内容,
基本可以确认指定的 基础镜像及版本