在dockerfile_best-practices中,我阅读了有关使用apt install
的信息:
版本固定会强制构建物检索特定版本,而不管缓存中的内容是什么。该技术还可以减少由于所需软件包中的意外更改而导致的故障。
我不知道它是如何工作的……docker不需要内省apt
命令来实现这一点吗?随同,验证RUN
指令是否包含apt install
指令以及将构成固定apt程序包的表达式?
谁能提供一些见识?
答案 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