'docker build:版本固定如何使构建缓存无效?

时间:2018-09-18 01:56:16

标签: docker dockerfile

dockerfile_best-practices中,我阅读了有关使用apt install的信息:

  

版本固定会强制构建物检索特定版本,而不管缓存中的内容是什么。该技术还可以减少由于所需软件包中的意外更改而导致的故障。

我不知道它是如何工作的……docker不需要内省apt命令来实现这一点吗?随同,验证RUN指令是否包含apt install指令以及将构成固定apt程序包的表达式?

谁能提供一些见识?

1 个答案:

答案 0 :(得分:2)

泊坞窗所做的只是查看您运行的字符串以及传入的环境,并将其与构建缓存中的其他映像进行比较。如果您的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:

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