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

55ooxyrt  于 2023-03-21  发布在  Go
关注(0)|答案(2)|浏览(196)

存储在GitHub中的My Go模块在本地编译成功;然而,如果我尝试通过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
(....)

下面是我的go.mod

module github.com/myuser/myrepo-test

go 1.16

还有Docker文件:

# 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"]
cuxqih21

cuxqih211#

14 0.535主动脉,开始: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下载它,所以构建失败。
那么,正确的解决方案如下所示:

停靠文件:

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 .

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

4xy9mtcn

4xy9mtcn2#

您可能还有其他一些文件夹,因此要为构建阶段复制整个文件夹和文件。
另外,Go语言是一种编译语言。这意味着,它会生成一个独立的二进制可执行文件。你需要做一个多阶段的部署来充分利用这一点。前面的答案只做构建,如果你这样做,Go语言及其库将成为Docker映像的一部分,并将Docker映像的大小推到400-500 MB。如果你做多阶段的构建,这将大大减少图像大小到15-50 MB。2想象一下吧!
你该这么做!

第一阶段:构建:第一阶段生成可执行文件。
第二阶段:部署:第二阶段复制可执行文件和任何环境变量(可以跳过)。
停靠文件可能如下所示:

# Build
FROM golang:alpine3.17 AS build
WORKDIR /app

COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -o /my-go-app

# Deploy
FROM alpine:latest
WORKDIR /app

COPY .env .
COPY --from=build /my-go-app .

ENTRYPOINT ["/app/my-go-app"]

相关问题