如何从 Docker 镜像提取 Dockerfile?

哈喽哈喽大家好,小编今天又有新发现!

今天在技术群摸鱼,有朋友问个 docker 的问题,替换配置文件不生效,也没有原先的 Dockerfile,所以就在想,有没有什么方式可以直接从容器或镜像生成 Dockerfile

虽然 docker history 命令可以看到所有历史层级的操作,但是还是需要手动去写 Dockerfile

google 一番,发现 dfimage 就是这样一个工具

dfimage 是一个 alpine 的镜像,启动的时候,通过将 docker.sock 映射到容器内部来运行,通常将这个操作做成别名

alias dfimage="docker run -v /var/run/docker.sock:/var/run


/docker.sock --rm alpine/dfimage" 


dfimage -sV=1.36 nginx:latest

我们拿 nginx 镜像试验下

先 pull 一个 nginx 镜像,我这里之前有,就直接用了,接着通过上面提到的命令,别名一个 dfimage 命令

做好别名之后,通过 dfimage 去生成 nginx 的 Dockerfile,其实就是启动一个容器工具,执行完之后即删除

即可看到完整的 Dockerfile

当然,你也可以通过 docker history 来实现,以下脚本即可

docker history --no-trunc $argv  | tac | tr -s ' ' | cut -d " " -f 5- | sed 's,^/bin/sh -c #(nop) ,,g' | sed 's,^/bin/sh -c,RUN,g' | sed 's, && ,n  & ,g' | sed 's,s*[0-9]*[.]*[0-9]*s*[kMG]*Bs*$,,g' | head -n -1

脚本解释如下:

tac : reverse the file
tr -s ' '                                       trim multiple whitespaces into 1
cut -d " " -f 5-                                remove the first fields (until X months/years ago)
sed 's,^/bin/sh -c #(nop) ,,g'                  remove /bin/sh calls for ENV,LABEL...
sed 's,^/bin/sh -c,RUN,g'                       remove /bin/sh calls for RUN
sed 's, && ,n  & ,g'                           pretty print multi command lines following Docker best practices
sed 's,s*[0-9]*[.]*[0-9]*s*[kMG]*Bs*$,,g'      remove layer size information
head -n -1                                      remove last line ("SIZE COMMENT" in this case)

通过这样的方式,同样也可以导出 Dockerfile

本文作者: InfoQ

本文文字及图片出自

余下全文(1/3)
分享这篇文章:

请关注我们:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注