我有一个运行以下命令的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认为该层已更改的特殊之处是什么?
答案 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?