docker 使用 apt-get 构建缓存破坏

标签 docker ubuntu apt-get

我的理解是,如果 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 best practices document这是关于 apt-get 的:

Using RUN apt-get update && apt-get install -y ensures your Dockerfile installs the latest package versions with no further coding or manual intervention. This technique is known as “cache busting”.


如果我将新包添加到列表中,这是正确的,但如果我不修改列表,则不是。
我的理解是否正确,或者我在这里遗漏了什么?
如果是,我可以假设我只会在 apt-get install 中获得更新的包吗?如果 Ubuntu 基础镜像也已更新(这会使整个缓存无效)?

最佳答案

你切断了中间的报价。报价的其余部分包括一个非常重要的条件:

You can also achieve cache-busting by specifying a package version. This is known as version pinning, for example:

RUN apt-get update && apt-get install -y \
    package-bar \
    package-baz \
    package-foo=1.3.*

因此,您在该示例中运行的命令每次都会通过更改列表中包的固定版本来更改。请注意,除了更改命令运行之外,您还可以更改环境,具有相同的效果,使用 build arg as described in this answer .

关于docker 使用 apt-get 构建缓存破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70947196/

相关文章:

node.js - 为以下应用程序结构编写 docker 的正确方法是什么?

laravel - laravel docker 设置中的 npm 权限问题

ubuntu - NFS 挂载在 Kubernetes 中的 ubuntu 节点上

docker - apache2:权限被拒绝:AH00072:make_sock:无法绑定(bind)到地址 0.0.0.0:80 没有可用的监听套接字,正在关闭

linux - 在 D 应用程序中链接到 Linux 下的 zlib 时如何解决此错误?

ubuntu - 单声道可以在 64 位 Linux 上运行吗?有什么问题吗?

java - 在 Ubuntu 12.04 中安装 Java 5

Docker 包 : Hash Sum Mismatch

linux - 如果我通过 apt-get 安装了 Mongo,我该如何更新它?

docker - Docker容器-端口设置