如何从图像生成 Dockerfile?

新手上路,请多包涵

是否可以从图像生成 Dockerfile?我想知道有两个原因:

  1. 我可以从存储库下载图像,但想查看生成它们的配方。

  2. 我喜欢保存快照的想法,但是一旦我完成了,最好有一个结构化的格式来回顾所做的事情。

原文由 user1026169 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 497
2 个回答

如何从图像生成或反转 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跳转),黄线是那个层中一些文件被改变的文件夹

(使用空格折叠目录)

旧答案

以下是旧答案,它不再起作用了。

 $ 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

原文由 BMW 发布,翻译遵循 CC BY-SA 4.0 许可协议

要了解如何构建 docker 映像,请使用 docker history --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 文件作为创建图像的第一步……

原文由 user6856 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进