找到给定镜像的Dockerfile

时间:2020-04-23 15:11:15

标签: docker

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

找到Dockerfile的最佳方法是什么?能否以某种方式获得给定图像的位置?

我尝试使用:

$ docker image inspect <image>

但它不会显示此信息。

2 个答案:

答案 0 :(得分:3)

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 :(得分: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与您的映像匹配仍然存在问题,那么您将有1000秒钟。

您可以尝试从映像重建dockerfile。 这个答案:https://stackoverflow.com/a/30793515/7281447

这个答案:https://stackoverflow.com/a/33918866/7281447
要么 这个答案:https://stackoverflow.com/a/30793515/7281447

描述执行此操作的方法。但是您正在对映像中的dockerfile进行“逆向工程”。即某些信息可能过于冗长或完全丢失。首先,它不会生成用于创建映像的干净的(很好评论!)dockerfile。

但是,现在您有了用于生成图像的历史命令列表。 您可以尝试从此列表中挑选具有独特外观的命令,然后将其重新插入到find w / grep命令中。我将首先从最新命令开始,因为您不太可能查看FROM映像中可能生成的那些命令(如果您的工具无法区分它们)。

编辑:当问题表明他们不知道文件位于何处时,答案假定该文件仍在文件系统中的某个位置或一组已知的文件系统中。我想不一定是这样。