缓存复用需手动拆分依赖下载与代码复制:先copy go.mod和go.sum,再run go mod download,最后copy源码;goproxy和gosumdb须显式固定,go.sum变更会导致缓存失效。

缓存能复用,但默认几乎不会自动生效——必须手动拆分依赖下载和代码复制两步,否则每次构建都重新拉模块。
go mod download 必须单独成层且前置
Docker 缓存按层判断,go mod download 这一步是否命中,只取决于它前面所有指令(尤其是 COPY go.mod 和 COPY go.sum)的内容是否变化。只要这两个文件没改,后续哪怕源码全换,这层依然复用。
- 错误写法:先
COPY . .再RUN go mod download—— 每次代码变,这一层就失效 - 正确顺序:
COPY go.mod go.sum ./→RUN go mod download→COPY . .→RUN go build - 注意:必须同时拷贝
go.mod和go.sum,否则go mod download可能因校验失败而失败或绕过缓存
多阶段构建中缓存仍有效,但需命名阶段
在 FROM golang:1.22 AS builder 这类命名阶段里,go mod download 层的缓存是独立维护的。即使你删掉最终镜像,只要 builder 阶段的中间镜像还在,下次构建仍可复用。
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
- CI 环境下建议加
--cache-from参数,指定上一次构建的 builder 镜像作为缓存源 - 避免用
docker build --no-cache调试时误伤长期缓存;真要清缓存,用docker builder prune更精准 - 如果使用 BuildKit(Docker 20.10+ 默认启用),可额外加
--mount=type=cache,id=gomod,target=/go/pkg/mod,把模块实际存储目录也挂载为外部缓存,进一步减少磁盘占用和重复解压
GOPROXY 设置不当会破坏缓存一致性
缓存命中的前提是 go mod download 下载的包内容完全一致。如果本地 GOPROXY 切换或指向不稳定的代理,同一 commit 可能拉到不同版本的依赖,导致校验失败、缓存跳过。
- 务必在 Dockerfile 中固定
ENV GOPROXY=https://goproxy.cn,direct(国内)或https://proxy.golang.org,direct(海外) - 不要依赖宿主机环境变量传入 GOPROXY —— 构建上下文不包含它,缓存键计算时视为“未设置”,容易错失命中
-
GOSUMDB同样要显式设为sum.golang.org或关闭(off),否则校验失败时go mod download会报错退出
最常被忽略的是 go.sum 文件的参与度——它不是可选附件,而是缓存键的一部分。哪怕只改了一行注释,go.sum 校验和变了,go mod download 层就失效。所以别手动编辑它,让 go mod tidy 自动维护。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










