我的理解是,如果RUN
命令“string”本身没有改变(即要安装的包列表没有改变),Docker引擎会使用该高速缓存中的映像进行相同的操作,这也是我的经验:
...
Step 2/6 : RUN apt update && DEBIAN_FRONTEND=noninteractive apt install -y curl git-all locales locales-all python3 python3-pip python3-venv libusb-1.0-0 gosu && rm -rf /var/lib/apt/lists/*
---> Using cache
---> 518e8ff74d4c
...
然而,官方的Dockerfile最佳实践文档是这样描述apt-get的:
使用RUN apt-get update && apt-get install -y
可以确保你的Dockerfile安装最新版本的软件包,而不需要进一步的编码或手动干预。这种技术被称为“缓存破坏”。
如果我向列表中添加了一个新的包,则会出现这种情况,但如果我不修改列表,则不会出现这种情况。
我的理解正确吗,还是我遗漏了什么?
如果是,我是否可以假设只有在Ubuntu基础映像也已更新的情况下,我才能在apt-get install
中获得更新的软件包(这会使整个缓存无效)?
2条答案
按热度按时间agxfikkp1#
你把中间的引文剪掉了。引文的其余部分包括了一个非常重要的条件:
还可以通过指定程序包版本来实现高速缓存破坏。这称为版本固定,例如:
因此,您在该示例中运行的命令每次都会通过更改列表中包的固定版本而更改。请注意,除了更改命令run之外,您还可以使用build arg as described in this answer更改环境,这具有相同的效果。
2guxujil2#
你说得对。文档写得很差。如果你进一步阅读,你就会明白作者想说的是什么:
s3 cmd参数指定版本1.1.*。如果映像以前使用的是旧版本,则指定新版本会导致apt-get update的高速缓存崩溃,并确保安装新版本。
看来作者认为“缓存破坏”是当你改变Dockerfile的方式,该高速缓存无效。但缓存破坏的通常定义是一种机制,通过它,我们可以使缓存无效,即使文件是相同的。