go build 无法在 docker 上找到本地依赖项
go build fails to find local dependencies on docker
我正在尝试为我的 go 服务器创建一个 docker 文件,但它一直失败,因为它无法识别某些本地依赖项(它们是代码本身的 mod 规则,而不是外部的依赖项)。
示例:
import (
"<private-repo-url>/src/cmd/http-api/bootstrap" // this a local module that's part of the server
"go.uber.org/fx"
)
func main() {
fx.New(bootstrap.Module).Run()
}
这是错误:
=> ERROR [7/7] RUN go build -a -o ./server 0.3s
------
> [7/7] RUN go build -a -o ./server:
#10 0.295 server.go:4:2: no required module provides package <private-repo-url>/src/cmd/http-api/bootstrap; to add it:
#10 0.295 go get <private-repo-url>/src/cmd/http-api/bootstrap
------
executor failed running [/bin/sh -c go build -a -o ./server]: exit code: 1
请注意,此 private-repo-url 对应于此应用程序的存储库(它不是外部依赖项)。
这是 Dockerfile
FROM golang:1.17
WORKDIR /balrog
# Copy dependency definitions and download them
ADD go.mod .
ADD go.sum .
RUN go mod download
# Build the binary
ADD ./src .
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
RUN go build -a -o ./server
#Run the server
CMD ["/server"]
和 mod.go 文件:
module <private-repo-url>
go 1.16
require (
github.com/gin-gonic/gin v1.7.7
github.com/google/uuid v1.3.0
github.com/kelseyhightower/envconfig v1.4.0
github.com/sirupsen/logrus v1.8.1
go.uber.org/fx v1.15.0
)
我读到 GO111MODULE 说它应该 on,我还读到它从 1.17 开始默认启用(here).
同样根据官方 docker 图片(在 dockerhub 中),正确的方法是使用 go get 和 go install复制所有文件后。这种方法让我遇到了一个稍微不同的问题,即 docker 无法访问存储库(因为它是私有的)并且我想避免向 docker 添加凭据。
我尝试使用环境变量 GOVCS 设置它的值,例如:
ENV GOVCS=github.com:git,gitlab.com:off
但它仍然失败并出现同样的错误。
最后我尝试了替换,我想如果我从本地依赖项中删除它会起作用,所以我执行了(在 Dockerfile 中)这个:
RUN go mod edit -replace <private-repo-url>=./
再次失败:
=> ERROR [builder 10/10] RUN go build -a -o ./server 0.3s
------
> [builder 10/10] RUN go build -a -o ./server:
#17 0.299 server.go:4:2: module <private-repo-url>/src provides package <private-repo-url>/src/cmd/http-api/bootstrap and is replaced but not required; to add it:
#17 0.299 go get <private-repo-url>/src
#17 0.299 server.go:5:2: no required module provides package go.uber.org/fx; to add it:
#17 0.299 go get go.uber.org/fx
有什么方法可以防止 go builder/package 安装程序从外部查找这些文件吗? go mod 和 go get + go install 都尝试访问这个私有存储库并因他们无权访问而失败。但是他们不应该首先尝试访问它,因为它是应用程序的存储库......或者是我做错了什么(很明显或者我不会在这里),遗漏了什么?
ADD ./src .
- 将 src
的内容复制到当前文件夹,剥离 src
部分。
应该就是COPY . ./
另请注意,不建议在源代码树中包含 src
子文件夹 - 包含 go.mod
的文件夹已经是源代码树。
我正在尝试为我的 go 服务器创建一个 docker 文件,但它一直失败,因为它无法识别某些本地依赖项(它们是代码本身的 mod 规则,而不是外部的依赖项)。
示例:
import (
"<private-repo-url>/src/cmd/http-api/bootstrap" // this a local module that's part of the server
"go.uber.org/fx"
)
func main() {
fx.New(bootstrap.Module).Run()
}
这是错误:
=> ERROR [7/7] RUN go build -a -o ./server 0.3s
------
> [7/7] RUN go build -a -o ./server:
#10 0.295 server.go:4:2: no required module provides package <private-repo-url>/src/cmd/http-api/bootstrap; to add it:
#10 0.295 go get <private-repo-url>/src/cmd/http-api/bootstrap
------
executor failed running [/bin/sh -c go build -a -o ./server]: exit code: 1
请注意,此 private-repo-url 对应于此应用程序的存储库(它不是外部依赖项)。
这是 Dockerfile
FROM golang:1.17
WORKDIR /balrog
# Copy dependency definitions and download them
ADD go.mod .
ADD go.sum .
RUN go mod download
# Build the binary
ADD ./src .
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
RUN go build -a -o ./server
#Run the server
CMD ["/server"]
和 mod.go 文件:
module <private-repo-url>
go 1.16
require (
github.com/gin-gonic/gin v1.7.7
github.com/google/uuid v1.3.0
github.com/kelseyhightower/envconfig v1.4.0
github.com/sirupsen/logrus v1.8.1
go.uber.org/fx v1.15.0
)
我读到 GO111MODULE 说它应该 on,我还读到它从 1.17 开始默认启用(here).
同样根据官方 docker 图片(在 dockerhub 中),正确的方法是使用 go get 和 go install复制所有文件后。这种方法让我遇到了一个稍微不同的问题,即 docker 无法访问存储库(因为它是私有的)并且我想避免向 docker 添加凭据。
我尝试使用环境变量 GOVCS 设置它的值,例如:
ENV GOVCS=github.com:git,gitlab.com:off
但它仍然失败并出现同样的错误。
最后我尝试了替换,我想如果我从本地依赖项中删除它会起作用,所以我执行了(在 Dockerfile 中)这个:
RUN go mod edit -replace <private-repo-url>=./
再次失败:
=> ERROR [builder 10/10] RUN go build -a -o ./server 0.3s
------
> [builder 10/10] RUN go build -a -o ./server:
#17 0.299 server.go:4:2: module <private-repo-url>/src provides package <private-repo-url>/src/cmd/http-api/bootstrap and is replaced but not required; to add it:
#17 0.299 go get <private-repo-url>/src
#17 0.299 server.go:5:2: no required module provides package go.uber.org/fx; to add it:
#17 0.299 go get go.uber.org/fx
有什么方法可以防止 go builder/package 安装程序从外部查找这些文件吗? go mod 和 go get + go install 都尝试访问这个私有存储库并因他们无权访问而失败。但是他们不应该首先尝试访问它,因为它是应用程序的存储库......或者是我做错了什么(很明显或者我不会在这里),遗漏了什么?
ADD ./src .
- 将 src
的内容复制到当前文件夹,剥离 src
部分。
应该就是COPY . ./
另请注意,不建议在源代码树中包含 src
子文件夹 - 包含 go.mod
的文件夹已经是源代码树。