RancherDesktop集群Docker构建时go mod download出现lame referral错误
问题描述
在Rancher Desktop集群执行Docker构建时,RUN go mod download步骤频繁出现DNS解析的lame referral错误,偶尔成功但大多在30秒后失败。企业VPN环境下本地直接执行go mod download正常,但Docker构建容器内无法正常拉取Golang依赖。
错误信息示例:
... => CACHED [builder 4/7] COPY go.sum go.mod Makefile /app/ 0.0s => ERROR [builder 5/7] RUN go mod download 18.5s ------ > [builder 5/7] RUN go mod download: #12 17.98 go mod download: github.com/aws/aws-sdk-go@v1.44.13: Get "https://storage.googleapis.com/proxy-golang-org-prod/6d16f241873ba42e-github.com:aws:aws-sdk-go-v1.44.13.zip?Expires=x&GoogleAccessId=gcs-urlsigner-prod%40golang-modproxy.iam.gserviceaccount.com&Signature=x": dial tcp: lookup storage.googleapis.com on 192.168.x.x:53: lame referral ... ------ executor failed running [/bin/sh -c go mod download]: exit code: 1
用户原Dockerfile:
FROM golang:1.16.4-buster AS builder ENV GOOS=linux GOARCH=amd64 CGO_ENABLED=1 GOPRIVATE="github.com/x" ARG GITHUB_ACCESS_TOKEN RUN mkdir -p -m 0600 /root/.ssh && \ ssh-keyscan github.com >> ~/.ssh/known_hosts && \ git config --global url."https://${GITHUB_ACCESS_TOKEN}:@github.com/".insteadOf "https://github.com/" # separate for better caching purpose WORKDIR /app COPY go.sum go.mod Makefile /app/ RUN go mod download COPY . . RUN make install && make build ...
解决方法
1. 修复DNS解析问题
lame referral错误本质是DNS服务器返回了无效的referral记录,导致容器无法正确解析域名。解决思路是让Docker构建容器使用企业VPN的DNS服务器,而非Rancher Desktop默认的DNS。
临时构建时指定DNS:
在docker build命令中添加--dns参数,替换为你的企业DNS服务器IP:docker build --dns 10.x.x.x --build-arg GITHUB_ACCESS_TOKEN=your_token .永久修改Rancher Desktop DNS配置:
打开Rancher Desktop设置 → Kubernetes → 找到"DNS"选项,选择"Custom DNS"并输入企业DNS服务器地址,保存后重启Rancher Desktop。
2. 配置Docker构建代理
本地VPN下能正常拉取依赖,说明代理配置有效,但Docker构建容器未继承代理环境变量。可通过以下两种方式配置:
构建命令传递代理参数:
docker build \ --build-arg HTTP_PROXY=http://your-proxy:port \ --build-arg HTTPS_PROXY=http://your-proxy:port \ --build-arg NO_PROXY=localhost,127.0.0.1,github.com,storage.googleapis.com \ --build-arg GITHUB_ACCESS_TOKEN=your_token .在Dockerfile中添加代理环境变量:
修改Dockerfile,在FROM之后添加代理相关的ARG和ENV,让容器继承代理配置:FROM golang:1.16.4-buster AS builder ENV GOOS=linux GOARCH=amd64 CGO_ENABLED=1 GOPRIVATE="github.com/x" ARG GITHUB_ACCESS_TOKEN # 添加代理参数 ARG HTTP_PROXY ARG HTTPS_PROXY ARG NO_PROXY ENV HTTP_PROXY=${HTTP_PROXY} ENV HTTPS_PROXY=${HTTPS_PROXY} ENV NO_PROXY=${NO_PROXY} RUN mkdir -p -m 0600 /root/.ssh && \ ssh-keyscan github.com >> ~/.ssh/known_hosts && \ git config --global url."https://${GITHUB_ACCESS_TOKEN}:@github.com/".insteadOf "https://github.com/" WORKDIR /app COPY go.sum go.mod Makefile /app/ RUN go mod download COPY . . RUN make install && make build ...
3. 调整GOPROXY配置
默认的proxy.golang.org可能在企业VPN下访问不稳定,可切换到国内公共代理或企业内部Go代理,甚至直接从源拉取:
在Dockerfile的ENV中添加GOPROXY配置:
ENV GOOS=linux GOARCH=amd64 CGO_ENABLED=1 GOPRIVATE="github.com/x" GOPROXY=https://goproxy.io,direct
https://goproxy.io是国内公共Go代理,可替换为企业内部代理地址;direct表示私有仓库(通过GOPRIVATE指定的)直接从源拉取,不走代理。
4. 验证容器内网络连通性
如果问题仍存在,可临时在Dockerfile中添加网络测试命令,定位具体连通问题:
WORKDIR /app COPY go.sum go.mod Makefile /app/ # 添加测试命令 RUN nslookup storage.googleapis.com RUN curl -I https://storage.googleapis.com RUN go mod download
构建时观察测试命令的输出,确认是否能正常解析域名和访问目标地址。
内容的提问来源于stack exchange,提问作者Jay Bouck

