如何从 Docker 镜像提取 Dockerfile?

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

元素周期表抱枕

本文由 TecHug 分享,英文原文及文中图片来自

你也许感兴趣的:

发表回复

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