gpt4 book ai didi

docker - ' docker 构建 : how does version pinning invalidate the build cache?

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

dockerfile_best-practices ,我读到,关于使用 apt install :

Version pinning forces the build to retrieve a particular version regardless of what’s in the cache. This technique can also reduce failures due to unanticipated changes in required packages.



我不明白它是如何工作的...... docker 不需要内省(introspection) apt命令来实现这一点?照原样,验证 RUN指令包含 apt install指令,以及构成固定 apt 包的表达式?

谁能提供一些见解?

最佳答案

docker 所做的只是查看您运行的字符串以及您传入的环境,并将其与构建缓存中的其他图像进行比较。如果您有一个不固定包的 Dockerfile,例如:

RUN apt-get update && apt-get install -y \
package-foo

当版本 1.2 是当前最新时,您首先运行它,然后在 1.3 发布后再次运行相同的命令,docker 将看到命令相同,并重用以前构建的镜像中的构建缓存,而不是拉取该软件包的较新版本。

相反,如果您指定一个版本,例如:
RUN apt-get update && apt-get install -y \
package-foo=1.2.*

然后使用包含不同版本的更新 Dockerfile 进行重建:
RUN apt-get update && apt-get install -y \
package-foo=1.3.*

第二个构建将是一个不同的命令来运行,因此强制 docker 重新运行构建而没有前一次运行的缓存。这还有一个优点,即 1.4 版本不会被意外拉入(例如,如果较早的行破坏了缓存或缓存被删除/禁用)。

如果您只想要这些软件包的最新版本,而不管缓存如何,那么您可以跳过版本锁定并故意破坏缓存或禁用缓存。要禁用缓存,您可以使用标志 --no-cache 进行构建。 .要故意破坏缓存,您可以传递一个不断变化的构建参数,例如:
docker build --build-arg "TIMESTAMP=$(date +%s)" .

还有一个 Dockerfile,它在您想要破坏缓存之前定义了构建参数:
ARG TIMESTAMP
RUN apt-get update && apt-get install -y \
package-foo

关于docker - ' docker 构建 : how does version pinning invalidate the build cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52377848/

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