docker 使用 apt-get 构建缓存清除

Tib*_*ács 9 ubuntu apt-get docker

我的理解是,如果RUN命令“string”本身没有改变(即要安装的包列表没有改变),docker引擎将使用缓存中的图像进行相同的操作。这也是我的经历:

\n
...\nStep 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/*\n ---> Using cache\n ---> 518e8ff74d4c\n...\n
Run Code Online (Sandbox Code Playgroud)\n

然而,官方Dockerfile 最佳实践文档对 apt-get 是这样说的:

\n
\n

使用RUN apt-get update && apt-get install -y可确保您的 Dockerfile 安装最新的软件包版本,无需进一步编码或手动干预。这种技术被称为\xe2\x80\x9ccachebusting\xe2\x80\x9d。

\n
\n

如果我向列表中添加新包,则情况如此,但如果我不修改列表,则情况并非如此。

\n

我的理解正确吗,还是我在这里遗漏了一些东西?

\n

apt-get install如果是,我是否可以假设只有 Ubuntu 基础映像也已更新(这会使整个缓存失效)时我才会获得更新的软件包?

\n

BMi*_*tch 3

你把中间的引言删掉了。引文的其余部分包括一个非常重要的条件:

您还可以通过指定包版本来实现缓存清除。这称为版本固定,例如:

RUN apt-get update && apt-get install -y \
    package-bar \
    package-baz \
    package-foo=1.3.*
Run Code Online (Sandbox Code Playgroud)

因此,您在该示例中运行的命令每次都会通过更改列表中包的固定版本来更改。请注意,除了更改命令运行之外,您还可以使用构建参数来更改环境,这具有相同的效果,如本答案中所述

  • @TiborTakács只要缓存存在,那就是正确的。如果您在没有缓存的情况下构建(通过标志或在不存在缓存的计算机上),那么您的构建将产生不同的图像。 (3认同)