隔离网环境下需离线预下载依赖:先在有网机器用go mod download -json生成清单,再用-o参数打包所有模块zip及go.sum;隔离网内设goproxy=off并指向解压路径,确保go build校验通过。

隔离网环境下无法执行 go mod download
直接运行 go mod download 会失败,因为默认走 HTTPS 请求到 proxy.golang.org 或直接拉取源码仓库(如 GitHub),而隔离网无外网出口。这不是 Go 配置问题,是网络拓扑限制——得把依赖“带进来”,不是“连出去”。
用 go mod download -json 提前生成离线包清单
在有外网的机器上,先解析项目所需全部模块及其精确版本(含间接依赖),避免漏包:
- 确保
go.mod已 clean(go mod tidy运行过) - 执行
go mod download -json > deps.json,输出类似:{"Path":"github.com/sirupsen/logrus","Version":"v1.9.0","Error":"","Info":"","GoMod":"","Zip":"","Dir":""} - 注意:不要用
go list -m all替代,它不包含 checksum 和实际下载路径,后续校验会失败
用 go mod download -o 打包所有 .zip 文件
-o 参数能将模块压缩包直接写入指定目录,这是离线部署的关键一步:
- 执行
go mod download -o ./goproxy.zip(Go 1.21+ 支持),生成单个 zip 包,含全部模块的.zip文件和go.sum校验信息 - 若 Go 版本低于 1.21,改用
go mod download -x查看下载路径,再手动cp对应$GOCACHE下的download/xxx/@v/xxx.zip文件 - 务必保留原始
go.sum文件——离线环境go build会校验它,缺了或不匹配会报checksum mismatch
隔离网内启用 GOPROXY=off 并配置本地缓存
进隔离网后不能设 GOPROXY=http://xxx(没代理服务),必须关掉代理并指向本地解压路径:
- 解压
goproxy.zip到某目录,比如/opt/gomod-cache - 设置环境变量:
GOPROXY=off、GOCACHE=/opt/gomod-cache(注意不是GOMODCACHE) - 验证是否生效:运行
go mod download github.com/sirupsen/logrus@v1.9.0,应静默成功;若报missing module,说明路径没对上或 zip 里缺文件
真正麻烦的是 vendor 同步和私有模块——如果依赖里有公司内部 GitLab 地址,go mod download 生成的清单不会包含其 commit hash,得额外用 git archive 手动打包,再按模块路径结构放进 GOCACHE 目录对应位置。











