寻找给定镜像的 Dockerfile

3

我正在使用Linux机器。大约3-4周前,我构建了一个Docker镜像,但我不记得Dockerfile的位置。

有什么最好的方法来找到Dockerfile吗?如果给出镜像,是否可能通过某种方式获取其位置?

我尝试使用:

$ docker image inspect <image>

但它没有显示这些信息。

无法确定 - Senior Pomidor
那就是我的想法! - garlicFrancium
尝试在“history”中查找命令。 - Senior Pomidor
2个回答

4

Docker镜像不会在Dockerfile中存储任何信息,但您可以尝试对其进行反向工程。有几种方法:

  1. 使用docker history <image-name> --no-trunc命令,它会显示每个层的信息:
> docker history golang:1.14.2-alpine3.11  --no-trunc --format="{{.CreatedBy}}"
/bin/sh -c #(nop) WORKDIR /go
/bin/sh -c mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
/bin/sh -c #(nop)  ENV PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/bin/sh -c #(nop)  ENV GOPATH=/go
...

  1. https://github.com/CenturyLinkLabs/dockerfile-from-image -- 这是一个从docker镜像反向工程Dockerfile的项目。您可以按以下方式运行它:
docker run -v /var/run/docker.sock:/var/run/docker.sock \
  centurylink/dockerfile-from-image <IMAGE_TAG_OR_ID>
  1. dive 是一个调试/优化 Docker 镜像的工具,但在这种情况下也可能会有帮助。

1
谢谢您的回答,看起来这是不可能的。我很感激这些解决方法,我会试一试。 - Paolo

1

这里不会有镜像和用于构建它的物理文件之间的直接链接。

您可以像搜索其他文件一样搜索Dockerfile。

find / -name "Dockerfile" -print

例如。
如果您大致知道Dockerfile上次编辑的时间:
find / -newermt "2020-01-01" ! -newermt "2020-04-31"

我是一位有用的助手,可以翻译文本。

如果您不知道Dockerfile的名称,但您可以记住其中的命令。 使用grep查找:

find . -type f -exec grep "FROM:mongo:latest" '{}' \; -print

这些都是标准的查找操作,与docker无关。
现在假设这仍然对您不起作用,或者您返回了数千个Dockerfile并且将正确的文件与您的镜像匹配仍然有问题。
您可以尝试从图像重新构建dockerfile。 此答案:https://dev59.com/3WIk5IYBdhLWcg3wn_b1#30793515

此答案:https://dev59.com/OmAf5IYBdhLWcg3wskiQ#33918866
或 此答案:https://dev59.com/3WIk5IYBdhLWcg3wn_b1#30793515 描述了实现此操作的方法。但是,您正在从图像“反向工程”dockerfile。即某些信息可能过于冗长或完全丢失。它不会生成干净(好注释!)的dockerfile,您首先用它创建了图像。
然而,现在您拥有历史命令列表,这些命令用于生成图像。 您可以尝试从此列表中挑选独特的命令,并将它们插入回您的find w / grep命令中。 我建议从最新的命令开始,因为您看到的可能不是在FROM镜像中生成的命令(如果您的工具无法区分它们)。
编辑:当问题陈述他们不知道文件在哪里时,答案假定文件仍然在文件系统的某个位置或已知文件系统的组中。我想这不一定是情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接