【问题标题】:Is it possible to extract the Dockerfile from a docker container是否可以从 docker 容器中提取 Dockerfile
【发布时间】:2014-08-13 04:14:03
【问题描述】:

我刚刚开始使用 Docker,如果能够查看用于创建现有 Docker 映像的 Dockerfile,将会非常有帮助。

即使图像是通过手动运行命令然后提交到标签来构建的,也很高兴能够看到图像是如何制作的,无论是出于学习目的还是出于安全考虑。

有没有办法提取 Dockerfile 或用于构建给定 Docker 映像的命令列表?


编辑(2021 年 11 月):由于人们仍在对此表示赞同,我可以说,根据答案和 cmets,我决定:

docker history --no-trunc --format '{{.CreatedBy}}' <image> | grep -v '#(nop)' | tac

它生成的输出很容易放入 Dockerfile。示例:

$ docker history --no-trunc --format '{{.CreatedBy}}' qemu | grep -v '#(nop)' | tac
ENV DEBIAN_FRONTEND=noninteractive
RUN /bin/sh -c apt-get update && apt-get -y upgrade # buildkit
RUN /bin/sh -c apt install -y qemu-system-arm gcc-arm-none-eabi build-essential cmake bison flex # buildkit
RUN /bin/sh -c useradd --create-home qemu # buildkit
WORKDIR /home/qemu
USER qemu
COPY baremetal-arm baremetal-arm # buildkit

但正如我也写的,我不认为有提取Dockerfile的好方法,所以如果你需要它,并且找不到源代码,也许可以给图像一个通过。

【问题讨论】:

  • 这能回答你的问题吗? How to generate a Dockerfile from an image?
  • @user7610 不是真的 :) 自从我问这个问题以来,我已经走了很长一段路。 “docker history”当时还不错,但既然你可以压缩层,我现在的结论是没有完美的方法来做到这一点。

标签: docker


【解决方案1】:

你有docker history &lt;image&gt;,这很有帮助。如果没有涉及标准输入的步骤,它甚至可以用于生成 dockerfile。

如果一个步骤是标准输入,唯一知道发生了什么的方法就是docker logs &lt;container id parent&gt;,但如果你没有容器,你就不能。

【讨论】:

  • 使用docker history --no-trunc,让你看到“一切”。
  • 不错。 docker history --no-trunc --format 'RUN {{.CreatedBy}}' &lt;image&gt; 最适合我。
【解决方案2】:

现在有 undocker 可用。 我们可以使用 pip 命令安装它。

pip install git+https://github.com/larsks/undocker/ 

并使用

docker save IMAGE_NAME | undocker -i -o OUTPUT_DIR

从 docker 中提取文件。

https://github.com/larsks/undocker/

【讨论】:

  • 这个工具好像没有按照要求做,就是如何重新创建一个 Dockerfile。它从 docker 容器中解压文件。
【解决方案3】:

有一个项目dockerfile-from-image 可以帮助您直接完成。

它需要一个 CLI 命令来恢复 Dockerfile:

docker run -v /var/run/docker.sock:/var/run/docker.sock centurylink/dockerfile-from-image &lt;IMAGE_TAG_OR_ID&gt;

必须已经安装了 Docker。

【讨论】:

  • 对我不起作用:/usr/lib/ruby/gems/2.2.0/gems/docker-api-1.24.1/lib/docker/connection.rb:42:in `rescue in request': 400 Bad Request: 格式错误的主机头 (Docker::Error::ClientError)
  • 这对我在 Linux 上使用重建的(但使用相同的 dockerfile)图像dduvnjak/dockerfile-from-image 有点工作,请参阅问题github.com/CenturyLinkLabs/dockerfile-from-image/issues/14 这里。看起来需要更新依赖项以考虑协议更改。也就是说,它不是一个完整的解决方案 - 它不会重建(从我的特定测试中)至少 VOLUMEENTRYPOINT 指令,并且专门来自该图像的构建步骤的文件只是被引用为“从这个其他图像中提取” ”。所以这是一个重要的 dockerfile 过程中的一个部分步骤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2015-06-15
  • 1970-01-01
  • 2018-11-13
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多