当Dockerfile命令被缓存时

弗朗切斯科·梅里(Francesco Meli)

我正在尝试了解docker缓存对于哪种类型的命令是危险的。

这里有一些例子,我相信会发生。

在我看来,这将始终使用缓存。我关心的?
并不是真的,因为如果以前的curl缓存安装版本使我的映像正常工作,那么它应该仍然有效:

RUN apt-get update && apt-get install --no-install-recommends -yy curl

仅当requirements.txt与以前相同时,此COPY命令才会使用缓存:

COPY ./requirements.txt /opt/client_web/requirements.txt

仅当/opt/client_web/requirements.txt的内容与以前完全相同时,此RUN命令才会缓存:否则,将不使用缓存:

RUN python3 -m pip install --default-timeout=100 -r /opt/client_web/requirements.txt

此RUN命令可能始终会缓存,并且可以。当然,如果发布了,我将不会获得更新版本的pip:

RUN curl https://bootstrap.pypa.io/get-pip.py > get-pip.py && python3 get-pip.py

以上说法正确吗?

如果是,我们可以说仅在命令不涉及文件更改的情况下才使用docker缓存吗?

皮埃尔·B。
RUN apt-get update && apt-get install --no-install-recommends -yy curl

除非先前的命令已经使缓存无效,否则该命令确实应该重新使用缓存。

仅当requirements.txt与以前相同时,第一个COPY命令将使用高速缓存

COPY ./requirements.txt /opt/client_web/requirements.txt

是。Docker将使用此文件的校验和来确保这一点。

仅当/opt/client_web/requirements.txt的内容与以前完全相同时,此行才会缓存。否则,它将不使用缓存。

RUN python3 -m pip install --default-timeout=100 -r /opt/client_web/requirements.txt

不完全正确,如果命令行更改,则不会重新使用缓存。仅在以下情况下才使用缓存:

  • 命令字符串与以前完全相同
  • 先前的命令未使缓存无效(例如,COPY使用其他文件)-在您的特定情况下,更改为requirements.txt

仅当此COPY之间没有指令时,您的声明才是正确的RUN在这两者之间放置的另一条指令可能会使缓存无效。

此外,Docker无法知道您的命令行实际上使用了该requirements.txt文件,只有命令字符串中的更改可能会告诉Docker在此特定步骤上使缓存无效。

这可能会一直缓存,我不介意。当然,如果发布了,我将不会获得更新版本的pip:

RUN curl https://bootstrap.pypa.io/get-pip.py > get-pip.py && python3 get-pip.py

是的,除非上一条指令使高速缓存无效或命令字符串更改。

如果是,我们可以说仅当命令涉及更改的文件时才使用缓存。

COPYADD这只是Docker可能会使缓存无效的方法之一。RUN可能还会使缓存无效,这不是因为涉及文件,而是因为shell命令的字符串已更改。另外,即使不涉及文件,任何Dockerfile指令更改都可能使缓存无效。请参阅杠杆构建缓存文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章