main.go:没有必需的模块提供包

Pet*_*vis 9 go docker

我的Go模块,存储在GitHub中,本地编译成功;但是,如果我尝试通过 docker 执行此操作,即使在本地同一文件夹中,对于子文件夹中的每个本地导入,我都会收到一条错误消息,抱怨我的本地包不存在:

=> ERROR [build 7/7] RUN go build -o myrepo-test .                                                                                                                                                                                                                          0.6s 
------
 > [build 7/7] RUN go build -o myrepo-test .:
#14 0.535 main.go:10:2: no required module provides package github.com/myuser/myrepo-test/common; to add it:
#14 0.535       go get github.com/myuser/myrepo-test/common
#14 0.535 main.go:13:2: no required module provides package github.com/myuser/myrepo-test/scraper/data/process; to add it:
#14 0.535       go get github.com/myuser/myrepo-test/scraper/data/process
(....)
Run Code Online (Sandbox Code Playgroud)

这是我的go.mod:

module github.com/myuser/myrepo-test

go 1.16
Run Code Online (Sandbox Code Playgroud)

和泊坞窗文件:

# use alpine due to its small footprint
FROM golang:1.16-buster AS build

WORKDIR /app

# download the required Go dependencies
COPY go.mod ./
COPY go.sum ./
RUN go mod download

COPY *.go ./

# FAIL
RUN go build -o myrepo-test .

##########
# Deploy #
##########

FROM gcr.io/distroless/base-debian10

WORKDIR /

COPY --from=build /myrepo-test /myrepo-test

USER nonroot:nonroot

ENTRYPOINT ["/myrepo-test"]

CMD ["/myrepo-test"]
Run Code Online (Sandbox Code Playgroud)

atl*_*ine 20

#14 0.535 main.go:10:2:没有必需的模块提供包 github.com/myuser/myrepo-test/common;添加它:
#14 0.535 转到 github.com/myuser/myrepo-test/common

上面意味着您common的源代码中有一个包。但COPY *.go ./不会将这些文件夹添加到 docker build 容器中,它只会将go files当前目录复制到 docker build 中。由于在容器中的源中go build找不到该包common,它将尝试从 中下载它github,因此构建失败。

那么,正确的解决方案如下:

Dockerfile:

FROM golang:1.16-buster AS build

WORKDIR /app

# download the required Go dependencies
COPY go.mod ./
COPY go.sum ./
RUN go mod download
#COPY *.go ./
COPY . ./

RUN ls

RUN go build -o myrepo-test .
Run Code Online (Sandbox Code Playgroud)

上面会将所有源添加到容器中,包括包common等,然后构建就可以了。