前言
今天遇到了一个很奇怪的问题,我已经通过
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
,如下
为何不生效?这个时候我想到了可能是执行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 .
等了一会儿,成功了
总结
从上面可以看出,确实是因为执行docker build的用户对应的环境变量没有更改成功,这里的方案是行得通的。
但是可能还有更好的方案,比如说指定执行命令的用户,又或者将GOPROXY环境变量设置成全局的(所有用户都走这个环境变量),这里就先不折腾了