gpt4 book ai didi

docker - 如何确定性地构建 Docker 镜像?

转载 作者:行者123 更新时间:2023-12-02 18:02:14 24 4
gpt4 key购买 nike

我正在尝试构建 Docker 镜像,并且我希望我的 Docker 镜像具有确定性。令我惊讶的是,我发现即使是一个微不足道的 Dockerfile,例如

FROM scratch
ENV a b

使用 docker build --no-cache . 重复构建时产生不同的 ID

我怎样才能使我的构建具有确定性,以及导致图像 ID 发生变化的原因是什么?启用缓存时,会生成相同的 ID。

我试图获得这种可重复性的原因是为了在分布式构建环境中生成相同的层。我无法控制运行构建的位置,因此我无法知道缓存中的内容。
此外,Docker 构建使用 wget 从 ftp 下载文件,该文件可能已更改,也可能未更改,目前我无法轻松地从 Dockerfile 中告诉 Docker 如果 RUN 的结果应该使缓存无效。因此,如果我可以为相同的层生成相同的 ID(当没有使用缓存时),这些层就不必再次“推”和“拉”了。

还有这里列出的所有原因: https://reproducible-builds.org/

最佳答案

AFAIK,当前 docker 图像不会散列到字节精确散列,因为元数据当前包含有状态信息,例如创建日期。您可以查看 design doc from 1.10 .不幸的是,看起来历史元数据是图像有效性和识别的重要组成部分。

不要误会我的意思,我只关心可重复的构建。但是,我不相信哈希精确度是衡量 docker 图像重现性的最佳标准。 docker 镜像不是编译后的二进制文件。没有办法保证一个阶段的结果能够被复制,所以即使没有日期时间元数据,它也不能保证可复制的构建。拿这个病理学例子:

RUN curl "https://www.random.org/strings/?num=1&len=20&digits=on&unique=on&format=plain&rnd=new" -o nonce.txt

关于docker - 如何确定性地构建 Docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53288388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com