【发布时间】:2019-04-16 17:19:47
【问题描述】:
我正在尝试构建 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/
【问题讨论】:
-
你为什么想要这种行为?如果您只想确定引用图像,请使用
docker build -t tag .标记它 -
这种行为对您有什么影响?
-
启用缓存时,我认为守护进程不会创建新图像。守护进程检测到层是相同的,因此它不会构建新图像。
-
我编辑了问题并提供了我的用例。
-
但是为什么你需要告诉Docker缓存是否应该失效呢? Docker 可以自己解决这个问题
标签: docker