码头工人如何缓存该层?

时间:2020-08-07 18:56:20

标签: docker containers

我有一个运行以下命令的docker映像

RUN apt-get update --fix-missing && apt-get install -y --no-install-recommends build-essential debhelper rpm ruby ruby-dev sudo cmake make gcc g++ flex bison git libpcap-dev libssl-dev ninja-build openssh-client python-dev python3-pip swig zlib1g-dev python3-setuptools python3-requests wget curl unzip zip default-jdk && apt-get clean && rm -rf /var/lib/apt/lists/*

如果我在同一天几次运行它,则该层似乎已缓存。但是,如果我每天第一次运行,docker会认为该层已更改。

只想知道上述命令中使docker认为该层已更改的特殊之处是什么?

3 个答案:

答案 0 :(得分:1)

这不是命令,而是执行之前的步骤。具体来说,是否修改了复制到上一层的文件。我可以更具体地说明一下,如果您要编辑该文章以在此文件之前显示Dockerfile中的所有步骤。

答案 1 :(得分:1)

这不是由docker引起的。当docker看到RUN命令时,它所做的只是简单的字符串比较,以确定该层是否在缓存中。如果在缓存中看到它,它将重用它;否则,它将运行它。

由于您已经提到过它会使用缓存构建一整天,而不是第二天,所以唯一可能的解释是在此期间某人/某物使缓存无效/删除了。

我不知道您如何/在何处运行docker守护程序,但可能是它在每天从基础映像重新创建的VM中运行,然后销毁所有缓存并迫使docker运行重建图像。

另一种解释是,您每天运行一些清理过程,也许有一些cron会删除缓存。

最重要的是,只要缓存真正存在,docker就会愉快地无限期地重复使用该缓存。

我假设以前的层是从缓存构建的(如果有的话),否则,如果COPY/ADD命令不会由于构建中的文件更改而导致缓存破坏,则应该寻找它们上下文。

答案 2 :(得分:0)

根据docker doc

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

对于RUN命令,它只是命令字符串本身用于查找匹配项。那么,也许所有进程都删除了缓存层,或者您更改了Dockerfile?