存储在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"]
2条答案
按热度按时间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
下载它,所以构建失败。那么,正确的解决方案如下所示:
停靠文件:
以上将添加所有源代码到容器中,包括包
common
等,然后构建就可以了。4xy9mtcn2#
您可能还有其他一些文件夹,因此要为构建阶段复制整个文件夹和文件。
另外,Go语言是一种编译语言。这意味着,它会生成一个独立的二进制可执行文件。你需要做一个多阶段的部署来充分利用这一点。前面的答案只做构建,如果你这样做,Go语言及其库将成为Docker映像的一部分,并将Docker映像的大小推到400-500 MB。如果你做多阶段的构建,这将大大减少图像大小到15-50 MB。2想象一下吧!
你该这么做!
第一阶段:构建:第一阶段生成可执行文件。
第二阶段:部署:第二阶段复制可执行文件和任何环境变量(可以跳过)。
停靠文件可能如下所示: