当前位置: 首页 > 面试题库 >

Docker如何知道在构建期间何时使用缓存,何时不使用缓存?

南门鸿振
2023-03-14
问题内容

我对Docker的层缓存表现出色感到惊讶,但我也想知道它如何确定是否可以使用缓存的层。

让我们以这些构建步骤为例:

Step 4 : RUN npm install -g   node-gyp
 ---> Using cache
 ---> 3fc59f47f6aa
Step 5 : WORKDIR /src
 ---> Using cache
 ---> 5c6956ba5856
Step 6 : COPY package.json .
 ---> d82099966d6a
Removing intermediate container eb7ecb8d3ec7
Step 7 : RUN npm install
 ---> Running in b960cf0fdd0a

例如,它如何知道可以使用缓存的层,npm install -g node-gyp但可以为其创建新层npm install呢?


问题答案:

在Dockerfile最佳实践构建缓存部分中相当详尽地解释了构建缓存过程。

* 从缓存中已存在的基本映像开始,将下一条指令与从该基本映像派生的所有子映像进行比较,以查看是否其中一个是使用完全相同的指令构建的。如果不是,则高速缓存无效。

  • 在大多数情况下,只需将中的指令Dockerfile与子图像之一进行比较就足够了。但是,某些说明需要更多检查和解释。

* 对于ADDCOPY指令,将检查图像中文件的内容,并为每个文件计算一个校验和。在这些校验和中不考虑文件的最后修改时间和最后访问时间。在高速缓存查找期间,将校验和与现有映像中的校验和进行比较。如果文件中的任何内容(例如内容和元数据)发生了更改,则缓存将无效。

  • 除了ADDCOPY命令外,缓存检查不会查看容器中的文件来确定缓存是否匹配。例如,在处理RUN apt-get -y update命令时,将不检查容器中更新的文件以确定是否存在缓存命中。在这种情况下,仅命令字符串本身将用于查找匹配项。

一旦缓存无效,所有后续Dockerfile命令将生成新映像,并且将不使用缓存。

您将遇到将OS软件包,NPM软件包或Git存储库更新为较新版本(例如中的~2.3semver
package.json)的情况,但是由于您未更新Dockerfile或未package.json更新,docker将继续使用缓存。

Dockerfile通过修改某些更智能的检查(例如,从回购中检索最新的git分支shasum以便在克隆指令中使用),可以以编程方式生成破坏缓存的a。您也可以定期运行构建--no- cache=true以强制执行更新。



 类似资料:
  • 问题内容: 我目前正在为我的应用程序开发Node后端。在对其进行docker化(docker build)时,最长的阶段是。该指令在每个小的服务器代码更改上运行,通过使开发人员每次等待构建完成来影响生产率。 我发现在应用程序代码所在的位置运行npm install并使用ADD指令将node_modules添加到容器中可以解决此问题,但这远非最佳实践。这有点破坏了将其Docker化的整个想法,并且使

  • 问题内容: 我目前正在为我的应用程序开发Node后端。在对其进行Docker化(docker build。)时,最长的阶段是。该指令在每个小的服务器代码更改上运行,通过使开发人员每次都等待构建完成来影响生产率。 我发现在应用程序代码所在的位置运行npm install并使用ADD指令将node_modules添加到容器中可以解决此问题,但这远非最佳实践。这有点破坏了将其Docker化的整个想法,并

  • 问题内容: 我希望尽快将自己的说明放入s中。 我读过许多 文章,解释了在应用程序其余部分之前添加您的内容如何在您未更改的情况下帮助您利用Docker自己的图像缓存。但是,如果依赖项确实发生了变化,甚至没有任何变化,这根本没有帮助。 下一步将是是否可以使用一致的pip缓存目录。默认情况下,它将在(在Linux上)缓存下载的软件包,因此,如果您要安装的模块的版本与系统上任何位置之前安装的模块相同,则无

  • 问题内容: 我正在使用Ajax根据某些ID从服务器检索数据,以执行自动建议功能。但是,当我提交表单并更新数据库时,“自动建议”字段应该不再包含此ID的任何内容,但仍会从其缓存中检索数据。有谁知道如何清除缓存并在每次按下按钮时发出Ajax发送请求以从服务器获取最新数据?请帮助我整个星期都坚持不下去,找不到解决方案。 例如:当ID字段为00001时,自动建议字段将为1,2,3。在我提交表单并更新数据库

  • 我有javaSpring启动应用程序。我想对经常读取的数据使用缓存。为此,我在我的jar中包含了以下依赖项 我还使用了@EnableCaching注释 使用@Cacheable注释和返回要缓存的数据的函数 但我仍然无法缓存数据。有什么我遗漏的吗?

  • 问题内容: 我想优化我的Dockerfile。我希望将缓存文件保留在磁盘中。但是,我发现当我运行它时,总是尝试从网络获取每个文件。 我希望在构建期间共享我的缓存目录(例如/ var / cache / yum / x86_64 / 6)。但是,它仅适用于。 有什么建议吗?(在此示例中,仅安装了1 rpm,在实际情况下,我需要安装数百rpm) 我的Dockerfile草案 在第二次,我想建立一个相似