Golang中Docker构建失败:无法加载包的解决方法
Golang中Docker构建失败:无法加载包的解决方法

问题:
每当我运行 docker build . 时,Docker 构建都会失败。
它提示无法加载包 A/B/C:找到了模块 A/B@latest (v0.0.0-20200130130556-6a5cffbc99af),但其中不包含包 A/B/C。
输出:
Step 1/8 : FROM golang:1.13
—> 6586e3d10e96
Step 2/8 : RUN printf “***” > ~/.netrc ## build account on bitbucket
—> Using cache
—> afccf96ed6c0
Step 3/8 : RUN mkdir -p /go/src/bitbucket.org/alishan/tapmongoservice
—> Using cache
—> af2c1ce54ce5
Step 4/8 : COPY . /go/src/bitbucket.org/alishan/tapmongoservice
—> ebec6a06817d
Step 5/8 : WORKDIR /go/src/bitbucket.org/alishan/tapmongoservice
—> Running in 0a332bb434b7
Removing intermediate container 0a332bb434b7
—> 1dcdac500f07
Step 6/8 : RUN mkdir /go/log && go build -o /go/bin
—> Running in 26e0514769e9
go: downloading bitbucket.org/alishan/tapgolib v0.0.0-20200130130556-6a5cffbc99af
go: downloading github.com/gorilla/mux v1.7.3
go: downloading github.com/gorilla/context v1.1.1
go: downloading github.com/gorilla/handlers v1.4.2
go: downloading go.mongodb.org/mongo-driver v1.2.1
go: extracting github.com/gorilla/context v1.1.1
go: extracting github.com/gorilla/handlers v1.4.2
go: extracting github.com/gorilla/mux v1.7.3
go: extracting bitbucket.org/alishan/tapgolib v0.0.0-20200130130556-6a5cffbc99af
go: extracting go.mongodb.org/mongo-driver v1.2.1
go: downloading github.com/golang/snappy v0.0.1
go: downloading github.com/go-stack/stack v1.8.0
go: downloading github.com/DataDog/zstd v1.4.4
go: extracting github.com/go-stack/stack v1.8.0
go: extracting github.com/golang/snappy v0.0.1
go: extracting github.com/DataDog/zstd v1.4.4
go: finding bitbucket.org/alishan/tapgolib latest
go: finding bitbucket.org/alishan/tapgolib/mongomgr latest
go: finding github.com/gorilla/context v1.1.1
go: finding github.com/gorilla/handlers v1.4.2
go: finding github.com/gorilla/mux v1.7.3
go: finding go.mongodb.org/mongo-driver v1.2.1
go: finding github.com/go-stack/stack v1.8.0
go: finding github.com/DataDog/zstd v1.4.4
go: finding github.com/golang/snappy v0.0.1
build bitbucket.org/alishan/tapmongoservice: cannot load bitbucket.org/alishan/tapgolib/mongomgr: module bitbucket.org/alishan/tapgolib[@latest](/user/latest) found (v0.0.0-20200130130556-6a5cffbc99af), but does not contain package bitbucket.org/alishan/tapgolib/mongomgr
The command ‘/bin/sh -c mkdir /go/log && go build -o /go/bin’ returned a non-zero code: 1
更多关于Golang中Docker构建失败:无法加载包的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang中Docker构建失败:无法加载包的解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go build 运行正常。
该模块无法访问,因为它是某个组织的私有模块。
如果你暂时将仓库设为公开(我知道这对你的公司来说可能存在潜在风险,如果你不想尝试,我完全理解),这样能行吗?
另外,你检查过在新克隆的仓库上进行非Docker构建吗?
当你克隆项目时,项目里是否有 go.sum 文件?
如果没有,错误信息中提到的提交版本上,该模块中的包是否确实存在?
如果你本地项目中有 go.mod 文件,但 Git 中没有,请检查 sum 文件中的 SHA 值是否与错误信息中的一致。对比一下该包是否在那之后被移除了。
为了确保无误,请在你的开发电脑上(Docker 环境外)重新克隆一份项目并尝试构建。不要使用你现有的克隆副本。结果如何?
我找到了解决方案。
导入的包仓库名是 mongoMgr,但包名是 mongomgr。我将包名和仓库名统一后,现在构建成功了。
不过,这引发了一个新的疑问:当包名与仓库名不同时,我们该如何解决此类构建问题?
感谢 Nobert。
是的,我的项目中确实有一个 go.sum 文件,并且该提交的模块中也存在这个包。
sum 文件中的 SHA 与错误信息中的一致,并且该包仍然存在。
在 Docker 环境之外,构建工作正常,但如果使用 Docker 构建,则会再次失败。
错误信息:构建 bitbucket.org/alishan/tapmongoservice: 时无法加载 bitbucket.org/alishan/tapgolib/mongomgr::找到了模块 bitbucket.org/alishan/tapgolib@latest (版本 v0.0.0-20200130130556-6a5cffbc99af),但它不包含包 bitbucket.org/alishan/tapgolib/mongomgr
这个错误表明Go模块系统找到了bitbucket.org/alishan/tapgolib模块,但该模块中不包含bitbucket.org/alishan/tapgolib/mongomgr包。这通常是由模块版本与代码导入路径不匹配导致的。
检查你的go.mod文件中bitbucket.org/alishan/tapgolib的版本声明。错误显示使用的是v0.0.0-20200130130556-6a5cffbc99af这个伪版本,但该版本可能不包含mongomgr子包。
以下是解决方案:
- 更新模块版本:
go get bitbucket.org/alishan/tapgolib@latest
- 或者指定包含所需包的特定版本:
go get bitbucket.org/alishan/tapgolib@v1.0.0 # 使用实际版本号
- Dockerfile优化示例:
FROM golang:1.13
WORKDIR /app
# 复制go.mod和go.sum文件
COPY go.mod go.sum ./
# 下载依赖
RUN go mod download
# 复制源代码
COPY . .
# 构建应用
RUN go build -o /go/bin/app ./cmd/main.go
- 如果问题持续,检查模块代理设置:
# 在Dockerfile中添加
ENV GOPROXY=https://proxy.golang.org,direct
ENV GOSUMDB=sum.golang.org
关键点:确保bitbucket.org/alishan/tapgolib仓库的对应版本确实包含mongomgr包结构。可以通过检查该仓库的tag或commit来验证包结构是否存在。

