如何确定性地构建Docker映像?

时间:2018-11-13 19:43:05

标签: docker

我正在尝试构建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/

2 个答案:

答案 0 :(得分:1)

图像ID是图像配置对象的SHA256(执行docker image inspect时得到的信息)。使用正在创建的图像运行此命令,您将看到它们之间的差异。

答案 1 :(得分:1)

AFAIK,由于元数据当前包含状态信息(例如创建日期),因此当前docker映像不会哈希为字节精确的哈希。您可以签出design doc from 1.10。不幸的是,历史元数据看起来是图像有效性和识别的重要部分。

不要误会我的意思,我的全部想法都是关于可复制的版本。但是我不认为哈希精确度是衡量docker映像可重复性的最佳标准。泊坞窗映像不是已编译的二进制文件。没有任何方法可以保证可以再现阶段的结果,因此,即使缺少日期时间元数据,也无法保证可复制的构建。以这个病理例子为例:

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