是否可以从映像生成Dockerfile ?我想知道有两个原因:
我可以从存储库下载图像,但希望看到生成它们的配方。 我喜欢保存快照的想法,但一旦我完成了,有一个结构化的格式来回顾所做的事情会很好。
是否可以从映像生成Dockerfile ?我想知道有两个原因:
我可以从存储库下载图像,但希望看到生成它们的配方。 我喜欢保存快照的想法,但一旦我完成了,有一个结构化的格式来回顾所做的事情会很好。
当前回答
这只需要两步就可以做到。首先提取映像,然后运行docker history命令。也如SS所示。
docker pull kalilinux/kali-rolling
docker history --format "{{.CreatedBy}}" kalilinux/kali-rolling --no-trunc
其他回答
如果您对Docker中心注册表中的图像感兴趣,并想查看Dockerfile?。
例子:
如果你想查看图片“jupyter/ datasscience -notebook”的Dockerfile,在浏览器地址栏中输入Dockerfile,如下图所示。
https://hub.docker.com/r/jupyter/datascience-notebook/
https://hub.docker.com/r/jupyter/datascience-notebook/Dockerfile
注意: 并非所有映像都有Dockerfile,例如https://hub.docker.com/r/redislabs/redisinsight/Dockerfile 有时这种方式比在Github中搜索Dockerfile要快得多。
在这一点上是不可能的(除非图像的作者显式地包含Dockerfile)。
然而,它绝对是有用的东西!有两件事将有助于获得这个特性。
可信构建(详见docker-dev讨论) 构建过程生成的连续映像中的更详细的元数据。从长远来看,元数据应该指出是哪个构建命令生成了映像,这意味着可以从一系列映像重建Dockerfile。
docker pull chenzj/dfimage
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm chenzj/dfimage"
dfimage image_id
dfimage命令的输出如下:
$ dfimage 0f1947a021ce
FROM node:8
WORKDIR /usr/src/app
COPY file:e76d2e84545dedbe901b7b7b0c8d2c9733baa07cc821054efec48f623e29218c in ./
RUN /bin/sh -c npm install
COPY dir:a89a4894689a38cbf3895fdc0870878272bb9e09268149a87a6974a274b2184a in .
EXPOSE 8080
CMD ["npm" "start"]
这只需要两步就可以做到。首先提取映像,然后运行docker history命令。也如SS所示。
docker pull kalilinux/kali-rolling
docker history --format "{{.CreatedBy}}" kalilinux/kali-rolling --no-trunc
要了解如何构建docker映像,请使用 Docker历史记录——no-trunc命令。
您可以从映像构建docker文件,但它不会包含您想要完全理解映像是如何生成的所有内容。合理地,你可以提取的是dockerfile的MAINTAINER、ENV、EXPOSE、VOLUME、WORKDIR、ENTRYPOINT、CMD和ONBUILD部分。
下面的脚本应该为您工作:
#!/bin/bash
docker history --no-trunc "$1" | \
sed -n -e 's,.*/bin/sh -c #(nop) \(MAINTAINER .*[^ ]\) *0 B,\1,p' | \
head -1
docker inspect --format='{{range $e := .Config.Env}}
ENV {{$e}}
{{end}}{{range $e,$v := .Config.ExposedPorts}}
EXPOSE {{$e}}
{{end}}{{range $e,$v := .Config.Volumes}}
VOLUME {{$e}}
{{end}}{{with .Config.User}}USER {{.}}{{end}}
{{with .Config.WorkingDir}}WORKDIR {{.}}{{end}}
{{with .Config.Entrypoint}}ENTRYPOINT {{json .}}{{end}}
{{with .Config.Cmd}}CMD {{json .}}{{end}}
{{with .Config.OnBuild}}ONBUILD {{json .}}{{end}}' "$1"
我使用它作为脚本的一部分,以图像的形式重新构建运行的容器: https://github.com/docbill/docker-scripts/blob/master/docker-rebase
如果您希望能够重新打包图像,Dockerfile主要是有用的。
需要记住的是,docker映像实际上可以是真实或虚拟机的tar备份。我已经用这种方法制作了几个docker映像。甚至构建历史也显示我导入了一个巨大的tar文件作为创建映像的第一步…