如何从 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 分享,英文原文及文中图片来自 。
你也许感兴趣的:
- Docker官方宣布将Docker强化版镜像免费开源
- 开发者常忽略的10项Docker超级技能
- 你想要微服务,但真的需要吗?
- 如何将我首个发布的Docker镜像体积缩减40%——关于将Shell脚本Docker化的经验分享
- 我在Docker里运行完整的Linux桌面系统,只因我能做到
- 多用户环境中的 rootless Docker
- Docker Image 终极理解
- 听起来不错的方法
- Docker 1 号员工亲述:我们曾犯下的 3 个错误!
- Docker 的诅咒:曾以为它是终极解法,最后却是“罪大恶极”?

你对本文的反应是: