You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker FROM层未缓存问题:重复拉取基础镜像耗时久

基础镜像未被Docker构建缓存的原因排查

我查阅了Docker构建缓存相关文档,了解到未变更的上层镜像层会被缓存。但多次构建时使用同一基础镜像,即使Dockerfile未修改,执行docker build -t my-container .仍会花费约30分钟重新拉取基础镜像。想知道导致基础镜像未被缓存的可能原因。

我的Dockerfile内容

FROM openjdk:22-jdk
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]

部分构建日志输出

> docker build -t my-container .
[+] Building 1319.7s (5/8)
 => [internal] load .dockerignore                                                                                                                                                                                                        0.2s
 => => transferring context: 2B                                                                                                                                                                                                          0.0s
 => [internal] load build definition from Dockerfile                                                                                                                                                                                     0.3s
 => => transferring dockerfile: 336B                                                                                                                                                                                                     0.0s
 => [internal] load metadata for <image>                                                                                                                                     6.3s
 => [auth] <image>:pull token for <registry>                                                                                                                                                     0.0s
 => [1/3] FROM <registry>/<image>@sha256:10bc31c03nm7c150b2f2553fc7afc658c2495214c262cbe47fb014020c24c9e3                                                                               1313.0s
 => => resolve <registry>/<image>:latest@sha256:10bc31c03nm7c150b2f2553fc7afc658c2495214c262cbe47fb014020c24c9e3                                                                                  0.4s
 => => sha256:10bc31c03nm7c150b2f2553fc7afc658c2495214c262cbe47fb014020c24c9e3 1.37kB / 1.37kB                                                                                                                                           0.0s
 => => sha256:f616452c03f1c6e4620f749a48f23cbc5c6c6078d1840cee93fdbb6ec71184e2 15.89kB / 15.89kB                                                                                                                                         0.0s
 => => sha256:b908537c6409239d2741043dce79199455e61a388c3abc3dfda849f3a67af982 231B / 231B                                                                                                                                               0.8s
 => => sha256:b35640c577f049266d491db188e821e49033f50105e85fc6d49f765f2bc151c5 281.02MB / 455.19MB                                                                                                                                    1312.4s
 => => extracting sha256:b908537c6409239d2741043dce79199455e61a388c3abc3dfda849f3a67af982                                                                                                                                                0.0s
 => [internal] load build context                                                                                                                                                                                                        0.3s
 => => transferring context: 232B                                                                                                                                                                                                        0.0s

环境信息

使用Windows笔记本电脑,运行Docker Desktop。


可能的原因

  • 浮动标签指向的镜像哈希变更:你使用的openjdk:22-jdk是浮动标签,官方可能更新了该镜像内容,导致标签对应的SHA-256哈希值变化。Docker每次构建会校验远程标签的最新哈希,若与本地缓存不匹配,就会重新拉取完整镜像。
  • Docker强制拉取配置开启:Docker Desktop设置中如果开启了"始终拉取镜像"(Pull always)类选项,会强制跳过本地缓存,每次构建都去远程仓库检查并拉取镜像。
  • 本地缓存被清理:手动删除过该基础镜像,或者Docker Desktop的自动清理功能(如清理未使用镜像)移除了缓存的基础镜像。
  • 镜像拉取不完整:之前的拉取过程因网络中断等问题导致镜像层下载不完整,下次构建时Docker会重新尝试拉取完整的镜像层,表现为未使用缓存。
  • 隐性触发缓存失效的变更:虽然Dockerfile未修改,但.dockerignore文件变更、构建上下文内文件元数据(如修改时间)异常变化,可能触发Docker重新校验基础镜像的逻辑,导致缓存失效。
  • 构建参数或版本问题:构建命令中隐含了--no-cache参数,或者使用的Docker版本存在缓存逻辑bug,导致缓存未被正确复用。

内容的提问来源于stack exchange,提问作者IceTea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:25:26