如何从 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
你也许感兴趣的:
- 多用户环境中的 rootless Docker
- Docker Image 终极理解
- 【程序员搞笑图片】听起来不错的方法
- Docker 1 号员工亲述:我们曾犯下的 3 个错误!
- Docker 的诅咒:曾以为它是终极解法,最后却是“罪大恶极”?
- 如何检查 Docker 镜像是否存在漏洞
- Docker+Wasm 第 2 个技术预览版发布,新增 3 个运行时引擎支持
- “虚伪”的 Docker 开始清退开源组织,不付费就删除所有镜像!
- Docker正在淘汰开源组织,想赚钱可以但吃相越来越难看了
- 优化 docker 镜像的几种方法
你对本文的反应是: