一些安全更新刚刚发布,我想重建我的 Docker 映像以利用这些更新。
但是,当我运行docker build .
它时,它立即完成而不更新任何内容,因为 中没有任何更改Dockerfile
,并且所有内容都被缓存。它甚至没有尝试apt-get update
在我的Dockerfile
.
apt-get update
即使没有任何变化,我如何强制 Docker 再次运行该命令?
有一个--no-cache
选项说它在构建期间不会使用缓存,但我希望它在之前的命令中使用缓存,apt-get update
并且我希望将结果保存到缓存中以供下次运行(替换当前缓存的图像),所以我肯定想使用缓存。
我也不能docker rmi
用来删除在运行后生成的图像apt-get
,因为它拒绝将此图像删除为image has dependent child images
.
您可以尝试以下方法:
第一次构建镜像
正如我们所见,所有层都已构建。再跑一次
现在所有图层都从缓存中获取。简单检查
现在,如果您需要为某些特定图层强制更新缓存,请使用以下命令
如您所见,第 1,2 层是从缓存中获取的,但第 3 层和所有最新层均已重建
再重复一次
我采取的另一种方法是使用
LABEL
命令:然后,只要标签中的日期发生更改,之后的每个命令都会再次运行。作为奖励,日期已内置到图像中,因此您可以使用它来检索它,
docker inspect --format '{{ index .Config.Labels "package.dates" }}' <container>
以便您可以检查您的图像以查找任何一段时间没有任何安全更新的图像,即使它们最近已重建。另一个可以节省更新包时间的技巧是先更新基础镜像。使用这样的 Dockerfile:
您可以运行
docker pull debian:stable
以将该标签/图像更新到最新版本。当您下一次构建 Docker 镜像时,它将从该新版本开始并在此之后重建所有内容,因为还没有任何缓存层从该新基础镜像开始。通常,基本映像会定期更新以包含最新的软件包,因此首先更新通常会导致以下
apt-get update
需要下载的软件包数量较少。