构建 Go docker 镜像时的'No required module provides package'



我的Dockerfile如下:

# syntax=docker/dockerfile:1
FROM golang:1.18-alpine
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN go build -o /datapuller
EXPOSE 8080
CMD [ "/datapuller" ]

我尝试使用$ docker build --tag datapuller .进行构建

但出现错误:

main.go:13:2: no required module provides package gitlab.com/mycorp/mycompany/data/datapuller/dbutil; to add it:
go get gitlab.com/mycorp/mycompany/data/datapuller/dbutil
main.go:14:2: no required module provides package gitlab.com/mycorp/mycompany/data/datapuller/models; to add it:
go get gitlab.com/mycorp/mycompany/data/datapuller/models

如何解决这个问题,我可以直接用go run main.go运行。

我的main.go导入如下。我认为进口造成了这个问题:

package main
import (
"encoding/json"
client "github.com/bozd4g/go-http-client"
"github.com/robfig/cron/v3"
"github.com/xuri/excelize/v2"
"gitlab.com/mycorp/mycompany/data/datapuller/dbutil"
"gitlab.com/mycorp/mycompany/data/datapuller/models"
"gorm.io/gorm"
)
func main() {
...

因为在构建时需要提取关联的包。Docker可能缺少提取这些包所需的环境变量。建议您使用go mod vendor命令,然后构建图像

FROM  golang:1.18-alpine
ADD . /go/src/<project name>
WORKDIR /go/src/<project name>
RUN go build -mod=vendor -v -o /go/src/bin/main main.go
RUN rm -rf /go/src/<project name>
WORKDIR /go/src/bin
CMD ["/go/src/bin/main"]

当您将源代码复制到映像中时,您只复制当前目录中的文件

COPY *.go ./ # just the current directory's *.go, not any subdirectories

通常更常见的做法是在整个主机源树中进行复制,可能使用.dockerignore文件导致某些源树被忽略

COPY ./ ./

否则,您需要将所需的特定子目录复制到映像中(每个目录都需要一个单独的COPY命令(

COPY *.go ./
COPY dbutil/ dbutil/
COPY models/ models/

相关内容

最新更新