运行go get时Docker构建失败报os.ErrDeadlineExceeded未定义错误
问题根因
报错核心原因是Go版本与依赖的golang.org/x/net库版本不兼容:os.ErrDeadlineExceeded是Go 1.15版本才新增的标准库错误常量,当前Docker构建环境使用的Go版本低于1.15,但拉取的golang.org/x/net/http2版本为较新的发行版,该版本已不再适配Go 1.14及更早版本,因此编译时触发未定义常量的报错。
排查步骤
- 查看Dockerfile中使用的Go基础镜像版本,进入构建容器执行
go version确认实际运行的Go版本号 - 执行
go list -m golang.org/x/net查看当前项目依赖的x/net库对应的版本tag或commit哈希,确认版本发布时间是否晚于Go 1.15的发布时间
解决方案
方案1:升级Go基础镜像版本(推荐)
直接将Dockerfile中的Go基础镜像替换为1.15及以上版本即可彻底解决兼容问题,示例修改如下:
# 替换原低版本Go镜像 # FROM golang:1.14-alpine FROM golang:1.20-alpine
升级后还可以获得新版本Go的性能优化、安全补丁,是优先级最高的修复方案。
方案2:锁定golang.org/x/net的兼容版本
如果受业务限制暂时无法升级Go版本,可以手动锁定x/net库到最后一个兼容Go 1.14的版本,对应commit哈希为d3edc9973b7e,调整Dockerfile中的构建指令即可:
RUN cd /go/src/${PROJECT_FOLDER_NAME}/ && \ go get golang.org/x/net@d3edc9973b7e && \ go get ./...
方案3:规范依赖版本管理
开启Go模块管理,通过go.mod文件统一锁定所有依赖的版本,避免go get时默认拉取最新版本触发兼容问题:
# 构建前设置Go模块参数 ENV GO111MODULE=on
如果构建时依赖拉取速度慢,可以额外配置国内GOPROXY加速。
内容的提问来源于stack exchange,提问作者mornindew
相关产品推荐
相关产品推荐

