docker如何缓存层?

docker如何缓存层?,docker,containers,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-de

我有一个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认为图层发生了变化?

这不是命令,而是之前发生的步骤。特别是,如果要复制到先前图层的文件已修改。我可以更具体地说,如果你编辑文章,在这之前显示docker文件中的所有步骤。

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

由于您提到它使用缓存构建了一整天,而第二天却没有,因此唯一可能的解释是,在这段时间内,缓存已被某人/某物失效/删除

我不知道您是如何/在哪里运行docker守护程序的,但它可能是在VM中运行的,该VM每天都从一个基本映像重新创建,然后会销毁所有缓存并强制docker重建映像

另一种解释是,您有一些每天运行一次的清理过程,可能是一些删除缓存的cron

底线是,只要缓存确实存在,docker将愉快地无限期地重用该缓存

我假设以前的层是从缓存(如果有)生成的,否则,如果生成上下文中的文件更改没有导致缓存崩溃,则应查找
COPY/ADD
命令。

根据:

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

对于
RUN
命令,仅使用命令字符串本身来查找匹配项。那么,可能有任何进程删除了缓存层,或者您更改了Dockerfile