是否可以从映像生成Dockerfile ?我想知道有两个原因:
我可以从存储库下载图像,但希望看到生成它们的配方。 我喜欢保存快照的想法,但一旦我完成了,有一个结构化的格式来回顾所做的事情会很好。
是否可以从映像生成Dockerfile ?我想知道有两个原因:
我可以从存储库下载图像,但希望看到生成它们的配方。 我喜欢保存快照的想法,但一旦我完成了,有一个结构化的格式来回顾所做的事情会很好。
当前回答
如何从映像生成或反向Dockerfile ?
你可以。主要是。
注意:它不会生成一个Dockerfile,你可以直接使用docker build;输出结果仅供参考。
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 nginx:latest
它将自动拉出目标docker映像并导出Dockerfile。参数-sV=1.36并不总是必需的。
参考:https://hub.docker.com/repository/docker/alpine/dfimage
现在,如果您选择一个特定的标记,hub.docker.com将直接使用详细命令显示图像层。
奖金
如果您想知道每一层中哪些文件被更改
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive"
dive nginx:latest
在左边,您可以看到每个层的命令,在右边(用tab跳转),黄线是该层中一些文件被更改的文件夹
(使用SPACE折叠目录)
旧的答案
下面是旧的答案,它不再工作了。
$ docker pull centurylink/dockerfile-from-image
$ alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm centurylink/dockerfile-from-image"
$ dfimage --help
Usage: dockerfile-from-image.rb [options] <image_id>
-f, --full-tree Generate Dockerfile for all parent layers
-h, --help Show this message
其他回答
不知何故,我完全错过了公认答案中的实际命令,所以在这里,它在自己的段落中更明显一些,看看有多少人像我一样
$ docker history --no-trunc <IMAGE_ID>
如何从映像生成或反向Dockerfile ?
你可以。主要是。
注意:它不会生成一个Dockerfile,你可以直接使用docker build;输出结果仅供参考。
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 nginx:latest
它将自动拉出目标docker映像并导出Dockerfile。参数-sV=1.36并不总是必需的。
参考:https://hub.docker.com/repository/docker/alpine/dfimage
现在,如果您选择一个特定的标记,hub.docker.com将直接使用详细命令显示图像层。
奖金
如果您想知道每一层中哪些文件被更改
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive"
dive nginx:latest
在左边,您可以看到每个层的命令,在右边(用tab跳转),黄线是该层中一些文件被更改的文件夹
(使用SPACE折叠目录)
旧的答案
下面是旧的答案,它不再工作了。
$ docker pull centurylink/dockerfile-from-image
$ alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm centurylink/dockerfile-from-image"
$ dfimage --help
Usage: dockerfile-from-image.rb [options] <image_id>
-f, --full-tree Generate Dockerfile for all parent layers
-h, --help Show this message
2018年12月更新宝马的答案
chenzj/dfimage -如hub.docker.com所述,从其他映像中重新生成Dockerfile。所以你可以这样使用它:
docker pull chenzj/dfimage
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm chenzj/dfimage"
dfimage IMAGE_ID > Dockerfile
这是源自@fallino的答案,通过使用docker历史的输出格式选项进行了一些调整和简化。因为macOS和Gnu/Linux有不同的命令行实用程序,所以Mac需要不同的版本。如果你只需要其中一个,你可以只使用那些行。
#!/bin/bash
case "$OSTYPE" in
linux*)
docker history --no-trunc --format "{{.CreatedBy}}" $1 | # extract information from layers
tac | # reverse the file
sed 's,^\(|3.*\)\?/bin/\(ba\)\?sh -c,RUN,' | # change /bin/(ba)?sh calls to RUN
sed 's,^RUN #(nop) *,,' | # remove RUN #(nop) calls for ENV,LABEL...
sed 's, *&& *, \\\n \&\& ,g' # pretty print multi command lines following Docker best practices
;;
darwin*)
docker history --no-trunc --format "{{.CreatedBy}}" $1 | # extract information from layers
tail -r | # reverse the file
sed -E 's,^(\|3.*)?/bin/(ba)?sh -c,RUN,' | # change /bin/(ba)?sh calls to RUN
sed 's,^RUN #(nop) *,,' | # remove RUN #(nop) calls for ENV,LABEL...
sed $'s, *&& *, \\\ \\\n \&\& ,g' # pretty print multi command lines following Docker best practices
;;
*)
echo "unknown OSTYPE: $OSTYPE"
;;
esac
要了解如何构建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文件作为创建映像的第一步…