DNS解析失败导致go mod download卡住时,应先用nslookup或dig确认问题,再通过GOPROXY指定IP地址(如https://142.251.42.241:443,direct)绕过DNS,并设置GOSUMDB=off禁用校验。

go mod download 报 DNS lookup failed 怎么办
域名解析失败时,go mod download 会卡在 lookup proxy.golang.org 或类似错误上,根本没走到 TCP 连接阶段。这不是代理地址写错,而是系统连域名都查不到——常见于企业内网 DNS 被劫持、容器里 /etc/resolv.conf 配置为空、或本地 hosts 文件误删了关键条目。
- 先确认是否真为 DNS 问题:运行
nslookup proxy.golang.org或dig proxy.golang.org +short,如果返回空或server can't find,就是 DNS 层故障 - 临时绕过 DNS:直接用 IP +
GOPROXY强制走 HTTPS(注意必须带https://前缀):GOPROXY=https://142.251.42.241:443,direct go mod download—— 这招对proxy.golang.org和goproxy.cn都适用,但需确保目标 IP 当前可连通(可用curl -v https://142.251.42.241:443测试) - 不推荐改 hosts:手动往
/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows)加映射虽能见效,但 IP 可能变更,且多个镜像源需维护多行,容易出错
为什么设置 GOPROXY=direct 仍会触发 DNS 查询
即使设了 GOPROXY=direct,Go 仍可能去查 sum.golang.org 的 DNS —— 因为 GOSUMDB 默认值是 sum.golang.org,而校验步骤独立于下载,它有自己的域名解析逻辑。所以只关代理不够,必须同步处理校验环节。
- 验证当前行为:执行
go env GOSUMDB,若输出不是off或内网可解析的地址,说明校验仍在尝试连外网 - 彻底禁用校验(仅限离线/可信环境):
go env -w GOSUMDB=off - 若需保留校验但换源:国内暂无公开托管
sum.golang.org全量数据的镜像,唯一可行的是自建sumdb服务,或使用支持校验代理的私有方案(如 Nexus Repository 的 Go 支持),普通用户建议优先关掉
容器或 CI 环境里 DNS 失效的典型表现与修复
Docker 容器启动时若未显式指定 DNS,会继承宿主机配置,但很多 CI 平台(如 GitHub Actions 默认 runner)的 DNS 设置过于精简,导致 proxy.golang.org 解析超时,错误日志里常出现 context deadline exceeded (Client.Timeout) 而非明确的 DNS 错误。
- 构建镜像时显式指定 DNS:在
Dockerfile中加RUN echo "nameserver 114.114.114.114" > /etc/resolv.conf,或启动容器时用--dns 114.114.114.114 - GitHub Actions 场景:在
.github/workflows/*.yml中添加env:块,设GOPROXY: https://goproxy.cn,direct和GOSUMDB: off,避免依赖系统 DNS - Kubernetes Pod:通过
dnsConfig.nameservers字段覆盖,默认值往往不可靠,尤其在混合云网络中
真正麻烦的不是配置本身,而是 DNS 失效时 Go 不会明确告诉你“查不到域名”,而是静默等待超时后报泛泛的连接错误。动手前先跑一句 nslookup,省掉 80% 的冤枉排查。

















