go env -w goproxy 是唯一可靠写法:go 1.13+ 废弃 shell 级 export,必须用 go env -w 写入用户级配置,支持多级 fallback(如 https://athens.internal:3000,direct),direct 为兜底项;私有域名需同步设 goinsecure;docker 中 athens 必须监听 0.0.0.0:3000 并挂载 storage。

go env -w GOPROXY 是唯一可靠写法
Go 1.13+ 已废弃 shell 级 export GOPROXY,尤其在 CI/CD 或 Docker 构建中必然失效。必须用 go env -w 写入用户级配置,且支持多级 fallback:
-
go env -w GOPROXY="https://athens.internal:3000,direct"—— 注意逗号分隔,direct是兜底项,不能漏 - 若 Athens 需 Basic Auth,URL 中必须带凭证:
https://user:pass@athens.internal:3000 - 设置后立刻验证:
go env GOPROXY,别信echo $GOPROXY,Go 进程已忽略它 - 私有域名(如
git.corp.com)必须同步加go env -w GOINSECURE="git.corp.com",否则证书错误直接中断
Docker 启动 Athens 必须暴露 0.0.0.0:3000
Athens 容器默认只监听 127.0.0.1:3000,宿主机或其它容器根本连不上。常见“代理没生效”本质是网络不通:
- Docker 启动时加
-p 3000:3000,且确认容器内监听地址为0.0.0.0:3000(不是localhost或127.0.0.1) - 客户端指向地址因平台而异:
http://host.docker.internal:3000(Mac/Win),Linux 则需用宿主机真实 IP,如http://192.168.1.100:3000 - Storage 路径必须挂载到宿主机,否则重启后缓存全丢:
volumes: - ./athens-storage:/var/lib/athens - 环境变量
ATHENS_GO_BINARY_ENV_VARS=GO111MODULE=on,GOPROXY=direct是必须项,否则内部go mod download会误走公网
私有模块拉不到 latest?先打 tag 或硬写版本
go mod download 默认查 latest,但私有 Git 仓库往往没打 tag,Athens 也无从猜测该取哪个 commit:
- 手动触发一次
go get example.com/mylib@v1.2.3,让 Athens 主动 fetch 并缓存该 tag - 或直接在
go.mod中写死:require example.com/mylib v1.2.3,再跑go mod download - GitLab 私有项目 visibility 必须设为
public或internal,private会导致 Athens 认证失败 - 确保 Git 服务用 HTTPS(非 HTTP),且证书可信;Athens 不支持自签名证书直连,必须配
GOINSECURE或换可信 CA
下载模式选 sync,别碰 async 或 redirect
Athens 的 DownloadMode 默认是 sync,这是最稳的选择。其他模式在企业场景下容易出问题:
-
async:返回 404,后台异步拉取——CI 构建直接失败,没人等后台完成 -
redirect:301 跳转到上游——绕过 Athens 缓存,失去代理意义 -
none:模块不存在就报错——等于没开代理,完全不可用 - 生产环境只用
sync,配合GOINSECURE和正确GOPROXY,就能覆盖 95% 场景
真正难的不是启动 Athens,而是让每个开发机、每台构建节点、每个 CI job 都执行一致的 go env -w 配置——漏一台,就会突然拉不到私有模块。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











