【问题标题】:How can I see Dockerfile for each docker image?如何查看每个 Docker 映像的 Dockerfile?
【发布时间】:2021-08-29 17:02:11
【问题描述】:

我有以下 docker 图像。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
docker/whalesay     latest              6b362a9f73eb        22 months ago       247 MB

有没有办法在我的本地系统上查看每个 docker 映像的 Dockerfile?

Where to see the Dockerfile for a docker image? 的答案对我没有帮助,因为它没有完全显示 Dockerfile,而是运行命令来创建映像。我想要 Dockerfile 本身。

【问题讨论】:

标签: docker dockerfile


【解决方案1】:

据我所知,不,你不能。因为 Dockerfile 用于构建映像,所以它不与映像本身打包。这意味着您应该对其进行逆向工程。您可以在图像或容器上使用docker inspect,从而获得一些洞察力并了解它的配置方式。图像的层也是可见的,因为您在拉特定图像时拉它们,所以这也不是秘密。

但是,您可以通常在 Dockerhub 上的映像本身的存储库中看到 Dockerfile。我不能说大多数存储库都附加了 Dockerfile,但我看到的大多数存储库都有它。

不同的存储库维护者可能会选择不同的方式来记录 Dockerfile。如果设置了自动构建,您可以在存储库页面上看到 Dockerfile 选项卡。但是当有多个并行版本可用时(例如Ubuntu),维护人员通常会选择将不同版本的 Dockerfile 链接放在描述中。如果您在这里查看:https://hub.docker.com/_/ubuntu/,在“支持的标签”下(同样,对于 Ubuntu),您可以看到每个 Ubuntu 版本都有多个 Dockerfile 的链接。

【讨论】:

  • 查看下方@themozel 的答案。现在你可以使用docker history 命令来查看镜像是如何构建的。
【解决方案2】:

由于镜像是直接从 Dockerhub 下载的,因此只有镜像会从 docker hub 拉到您的机器中。如果您想查看 dockerfile,则可以转到 docker hub 并以标记格式(例如 ubuntu:14.04)键入图像名称和版本名称,这将打开图像以及 Docker 文件详细信息。还要记住,只有图像的所有者共享了他们的 Dockerfile,你才能看到它。否则不行。大多数官方镜像不会为您提供 Dockerfile。

希望对你有帮助!

【讨论】:

  • 如果我去hub.docker.com/search/?q=ubuntu%3A14.04 我看不到官方的 ubuntu:14.04 图像。相反,我看到其他用户创建的 ubuntu 14.04 图像。如何搜索官方的 ubuntu:14.04 镜像?
  • 不同的repos有点不同。如果设置了构建,您可以在存储库中看到 Dockerfile 选项卡。但是当有多个并行版本可用时,维护人员通常会选择在自述文件中列出不同版本的 Dockerfile。如果你看一下这里:hub.docker.com/_/ubuntu,在“支持的标签”下,你可以看到每个 Ubuntu 版本都有多个 Dockerifile 的链接。编辑:我会将其添加到我的答案中。
  • 嗨@LoneLearner ... 这是官方的 ubuntu 存储库,包含 Ubuntu 发布的所有版本。 hub.docker.com/_/ubuntu Dockerfile 可以在:github.com/tianon/docker-brew-ubuntu-core/blob/… 在官方 ubuntu 页面中看到,Docker 文件链接到 github 给出了
【解决方案3】:

您还可以从图像中重新生成 dockerfile 或使用 docker history 命令查看里面的内容。 检查这个:Link to answer

TL;DR 因此,如果您有一个由 dockerfile 构建的 docker 映像,则可以恢复此信息(除原始 FROM 命令之外的所有信息,这很重要,我会同意。但您经常可以猜到,尤其是通过进入容器并问“你是什么操作系统?”)。但是,图像的制作者可能有你永远不会知道的手动步骤,而且他们可以只导出一个图像,然后重新导入它,此时不会有中间图像。

【讨论】:

  • 该链接可能会回答这个问题,但也可能会在未来的某个时间发生变化。因此,请在此处将链接文档的相关部分添加到您的答案中,以使其持久且可通过搜索找到。谢谢你。 :)
【解决方案4】:

一种方法可以是saveimage.tar 文件中的图像。接下来提取文件并尝试探索是否可以在任何层目录中找到 Dockerfile。

docker image save -o hello.tar hello-world

这将输出一个hello.tar 文件。

hello.tar 是压缩后的输出图像文件,hello-world 是您要保存的图像的名称。

之后,提取压缩文件并浏览图像层目录。您可能会在其中一个目录中找到 Dockerfile。

但是,有一点需要注意,如果构建映像时忽略了.dockerignore 中的Dockerfile。那么通过这种方式你将找不到Dockerfile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2015-06-24
    • 2020-11-06
    • 2017-02-11
    • 2016-10-13
    相关资源
    最近更新 更多