【问题标题】:Why is the COPY instruction causing a cache miss in my Docker build为什么 COPY 指令在我的 Docker 构建中导致缓存未命中
【发布时间】:2019-11-27 23:39:34
【问题描述】:

我的项目的 docker 文件中的 copy instruction 似乎会导致 cache miss,即使自从上次将映像推送到 docker hub 以来,被复制的文件都没有更改。这会导致所有后续层错过缓存,从而使构建花费的时间比应有的要长得多。我还注意到,属于每一层的哈希值似乎与我在本地计算机上docker build 时的哈希值不同。这可能是因为 docker 版本不匹配吗?这里发生了什么?我该如何诊断?

【问题讨论】:

  • 可以分享Dockerfile或者COPY指令吗?
  • github 链接似乎很糟糕(%20https 不是有效协议,甚至将其更改为 https 我得到一个错误)。在任何情况下,StackOverflow 指南都要求您共享 在问题本身中不起作用的代码,以便我们查看它。
  • 不确定这 20% 是如何进入复制说明链接的。现已修复。

标签: docker haskell travis-ci haskell-stack


【解决方案1】:

检查使用docker history --no-trunc $image 构建的不同图像的层。在复制步骤中,您将看到正在复制的文件的“file:abc”哈希:

IMAGE                                                                     CREATED             CREATED BY                                                                                                        SIZE                COMMENT
sha256:202cb043f70a2565ea40629e891642e1e24be7b52e29116a6520736f47183904   9 minutes ago       /bin/sh -c #(nop) COPY file:d523f0d1cac93e44179baf9c36a7a4feff221b604224e26900075ddb02812448 in /test/test.txt    12B

如果您正在构建的两个映像之间的哈希值不同,那么这将使构建缓存无效并导致未命中。请记住,文件的元数据也可能导致缓存未命中,尤其是文件权限。如果您仍然遇到问题,请更新问题以包含来自不同版本的 docker history --no-trunc ... 输出。

【讨论】:

    【解决方案2】:

    如果您的文件内容确实没有改变,权限的差异可能会导致缓存失效。

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

    https://docs.docker.com/develop/develop-images/#leverage-build-cache

    【讨论】:

    • 目前这种情况发生在 GitLab CI 中,因为 bug 导致源被克隆为 666 权限。
    【解决方案3】:

    您如何完全确定在上下文中修改了任何文件?
    在 docker 将上下文发送到引擎时,您是否有一个 .dockerignore file 包含您想要忽略的所有文件/目录?

    有很多文件可以修改而您不知道。例如,如果您在上述上下文中有一个.git 文件夹,并且您创建了一个git commit,那么您的缓存将失效。

    确保忽略 .dockerignore 文件中不需要的文件。

    【讨论】:

    • 有问题的代码是 COPY ./stack-7.10.yaml ./stack-8.0.yaml ./stack-8.2.yaml /taffybar/,所以我认为 dockerignore 文件不会有任何效果...
    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 2013-09-04
    • 1970-01-01
    • 2012-05-11
    • 2020-05-03
    • 2014-11-15
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多