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

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

问题: 每当我运行 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

7 回复

如果不尝试构建 Docker 容器,执行

$ go build

是否有效?模块 http://bitbucket.org/alishan/tapgolib/mongomgr 不存在或无法访问。

更多关于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子包。

以下是解决方案:

  1. 更新模块版本
go get bitbucket.org/alishan/tapgolib@latest
  1. 或者指定包含所需包的特定版本
go get bitbucket.org/alishan/tapgolib@v1.0.0  # 使用实际版本号
  1. 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
  1. 如果问题持续,检查模块代理设置
# 在Dockerfile中添加
ENV GOPROXY=https://proxy.golang.org,direct
ENV GOSUMDB=sum.golang.org

关键点:确保bitbucket.org/alishan/tapgolib仓库的对应版本确实包含mongomgr包结构。可以通过检查该仓库的tag或commit来验证包结构是否存在。

回到顶部