Docker构建Go项目返回非零代码1,依赖包缺失如何解决?
github.com/tidwall/tile38/client包找不到的问题 嘿,我看到你在构建Go项目的Docker镜像时碰到了依赖包缺失的问题——go-wrapper download卡在了找不到github.com/tidwall/tile38/client这个包上,返回了非零错误码1。我来帮你搞定这个问题:
问题根源
从构建日志能看出来,go get已经尝试拉取了github.com/tidwall/tile38仓库,但就是找不到client子包。这是因为tile38的仓库结构在新版本里发生了变更:早期版本的tile38把client模块放在根目录的client文件夹下,但后来的版本重构了目录,把client移到了pkg/client路径下。而你的代码还是用的旧路径,直接拉取最新版的话自然会找不到。
具体解决办法
办法一:适配新版本的tile38路径
如果你的项目可以兼容新版本,只需要修改代码里的导入语句就行。把原来的:
import "github.com/tidwall/tile38/client"
改成:
import "github.com/tidwall/tile38/pkg/client"
改完之后重新执行Docker构建命令应该就没问题了。
办法二:锁定tile38的旧版本
要是你的项目依赖旧版本的目录结构,不想改代码,那就在Dockerfile里手动指定拉取旧版本的tile38。在RUN go-wrapper download这一步之前,加上:
RUN go get github.com/tidwall/tile38@v1.29.0
(v1.29.0是最后一个保留github.com/tidwall/tile38/client路径的版本,你可以根据实际需要调整版本号)
这样go get会拉取指定的旧版本,路径就能和你的代码匹配上了,后续go-wrapper download也能顺利完成。
办法三:替换老旧的go-wrapper工具
go-wrapper是比较过时的工具了,如果你能升级Go版本到1.11+(支持Go Modules),可以改用模块管理依赖:
- 在项目根目录执行
go mod init goyo.in/gpstracker生成go.mod文件 - 执行
go mod tidy自动整理并下载所有依赖 - 修改Dockerfile,使用支持Modules的Go镜像(比如
golang:1.16),并在构建时启用Modules:ENV GO111MODULE=on
不过你的项目现在用的是Go 1.8,这个方案可能暂时不适用,还是优先用前两个办法。
验证修复
改完之后,重新跑一遍构建命令:
sudo docker build -t gpst .
这次应该能顺利下载所有依赖,完成镜像构建啦。
内容的提问来源于stack exchange,提问作者PRATIK NAIK

