如何对Docker映像进行确定性构建?

如何对Docker映像进行确定性构建?,docker,Docker,我正在尝试建立Docker图像,我希望我的Docker图像是确定性的。令我大吃一惊的是,我发现即使是像 FROM scratch ENV a b 使用docker build(无缓存)重复生成时生成不同的ID。 我如何使我的构建具有确定性,以及是什么导致图像ID发生变化?启用缓存时,将生成相同的ID 我试图获得这种可再现性的原因是为了能够在分布式构建环境中生成相同的层。我无法控制生成在何处运行,因此我无法知道缓存中有什么。 此外,Docker build使用wget从ftp下载文件,该文件可能

我正在尝试建立Docker图像,我希望我的Docker图像是确定性的。令我大吃一惊的是,我发现即使是像

FROM scratch
ENV a b
使用docker build(无缓存)重复生成时生成不同的ID。

我如何使我的构建具有确定性,以及是什么导致图像ID发生变化?启用缓存时,将生成相同的ID

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


还有这里列出的所有原因:

映像ID是映像配置对象的SHA256(执行
docker映像检查时得到的)。使用您正在创建的图像运行此操作,您将看到它们之间的差异。

AFAIK,当前docker图像不会哈希到字节精确哈希,因为元数据当前包含有状态信息,如创建日期。你可以查一下。不幸的是,历史元数据似乎是图像有效性和标识的重要组成部分

别误会,我只关注可复制的构建。然而,我不认为哈希精确性是衡量docker图像再现性的最佳标准。docker映像不是已编译的二进制文件。无法保证阶段的结果能够被复制,因此即使没有datetime元数据,也不能保证可复制的构建。就拿这个病理学的例子来说:

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

你为什么想要这种行为?如果您只是想确实引用一个映像,请使用
docker build-t标记对其进行标记。
此行为对您有何影响?启用缓存时,我认为守护进程不会创建新映像。守护进程检测到层是相同的,因此它不会构建新映像。我编辑了问题并提供了我的用例。但是为什么需要告诉Docker缓存是否应该无效?Docker可以自己解决这个问题