我正在使用 Docker 将 Golang 应用程序容器化,但在从 Dockerfile 获取可执行文件时遇到了问题。
这是 Dockerfile:
# syntax=docker/dockerfile:1
FROM golang:1.22.2
WORKDIR /app
# Download Go modules
COPY go.mod go.sum ./
RUN go mod download
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o /sac
EXPOSE 8080
# Run
CMD ["/sac"]
几乎直接从 Docker 文档中关于构建 Go 镜像的内容中摘录。当我去构建这个(
docker build --tag sac-server .
)时,我遇到了一堆错误,它们看起来都是这样的:
main.go:10:2: no required module provides package github.com/GenerateNU/sac/backend/config; to add it:
go get github.com/GenerateNU/sac/backend/config
我在我们的包中为各个模块提供了一堆这些。完整项目的名称(在 (
go.mod
) 中定义为 module github.com/GenerateNU/sac/backend
,在本例中 /config 是一个子包。我们的目录如下所示:
backend
--->auth
--->config
--->constants
--->database
---><a bunch of other modules>
--->go.mod
--->go.sum
--->main.go
--->Dockerfile
我们遇到的所有关于“不需要的模块”的错误都是引用了 main.go 的子模块/包。
我该如何解决这个问题?我尝试将
go mod download
替换为 go get -d -v .
和 go mod tidy
,但出现了相同的错误。谢谢你!如果我没有提供有关我们的代码库的足够信息,您可以在此处查看我们的存储库链接:https://github.com/generateNU/sac
看来我已经解决了我自己的问题。我在这里找到了另一个有类似问题的答案,并用这个替换了我的 Dockerfile:
# syntax=docker/dockerfile:1
FROM golang:1.22.2
RUN mkdir /app
ADD . /app
WORKDIR /app
COPY go.mod go.sum ./
# Download all the dependencies
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
至此构建成功。我们还有一个
.dockerignore
忽略了 main.go
中实际使用的两个子包,所以我删除了它以消除这些错误。