为何配置了GOPROXY却莫名其妙无效?

1,647 阅读2分钟

前言

今天遇到了一个很奇怪的问题,我已经通过

 go env -w GOPROXY=https://goproxy.cn,direct

配置了代理,但是在docker build镜像时,在下载依赖环节,一直提示访问https://proxy.golang.org/超时,明明已经配置了代理,为何?

思考中……

我的Dockerfile是这样子

 # 基于go基础镜像构建
 FROM golang:latest as builder
 ​
 # 维护者信息
 LABEL maintainer="JoyCode <JoyCoding@qq.com>"
 ​
 # 设置容器内部的工作目录
 WORKDIR /app
 ​
 # 拷贝  go mod 和 sum 文件
 COPY go.mod go.sum ./
 ​
 # 根据go mod下载依赖
 RUN go mod download
 ​
 # 从当前目录拷贝到容器工作目录
 COPY . .
 ​
 # build go应用
 RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
 ​
 ​
 ######## alpine镜像 #######
 FROM alpine:latest
 ​
 # 该镜像详细可参考:https://golang-tech-stack.com/post/5751
 ​
 # 运行包管理
 RUN apk --no-cache add ca-certificates
 ​
 # 工作目录
 WORKDIR /Users/flying/docker/go-k8s/
 ​
 # 从前面的stage拷贝预编译的二进制文件
 COPY --from=builder /app/main .
 ​
 # 暴露端口
 EXPOSE 8080
 ​
 # 执行命令
 CMD ["./main"]

然后执行

 docker build -t go-k8s .

构建镜像到RUN go mod download 这一步,就提示访问https://proxy.golang.org/超时,于是执行go env,如下

image-20230322101812262

为何不生效?这个时候我想到了可能是执行go env时的环境变量是生效的,但是当通过docker build命令执行时,用户不一样,所以环境变量相同了?很有可能!!!

试试吧

于是我在Dockerfile中RUN go mod download的前面增加了一行

 RUN go env -w GOPROXY=https://goproxy.cn  # 确保执行命令时的用户环境变量是走代理
 RUN go mod download

然后再次执行

 docker build -t go-k8s .

等了一会儿,成功了

image-20230322104631663

总结

从上面可以看出,确实是因为执行docker build的用户对应的环境变量没有更改成功,这里的方案是行得通的。

但是可能还有更好的方案,比如说指定执行命令的用户,又或者将GOPROXY环境变量设置成全局的(所有用户都走这个环境变量),这里就先不折腾了