我有一个多阶段的Dockerfile文件(uisng BuildKit),其中包含一个初始阶段来go get几个工具,我需要在以后的阶段使用它们作为二进制文件。下面的例子就是它的要点:
# syntax = docker/dockerfile:1.0-experimental
# Go build stage
FROM golang:1.14-alpine3.12 AS gobuild
RUN apk add --no-cache git
RUN GO111MODULE=on go get -v github.com/tool1/tool1
RUN GO111MODULE=on go get -v github.com/tool2/tool2
RUN GO111MODULE=on go get -v github.com/tool3/tool3
# ...
# Release stage
FROM base AS release
# Copy Go binaries
COPY --from=gobuild /go/bin/tool1 /usr/local/bin/tool1
COPY --from=gobuild /go/bin/tool2 /usr/local/bin/tool2
COPY --from=gobuild /go/bin/tool3 /usr/local/bin/tool3
# ...这样做效果很好。我唯一的问题是,每个docker build都需要再次下载Go模块,也就是说,它们不会被缓存。
经过一些研究,我读到了go mod download,它是根据go.mod在本地缓存Go模块的。
Docker文件对我来说是一个很好的解决方案,因为它声明了确切的模块版本;所以当使用go.mod时,缓存将会简单得多,因为层可以被重用,除非go.mod发生了变化。
我只需运行go mod init github.com/me/myproject,然后随后的go get调用将相关模块添加到go.mod中,就可以轻松实现这一点。
但我遗漏了最后一部分,它类似于go mod download,但具有与go get相同的“输出”,它将构建的二进制文件保存到GOBIN。
为了澄清,我使用的是用Go构建的工具的二进制文件,但我的项目本身并不是Go应用程序,它只使用这些工具。
发布于 2021-08-03 09:15:54
正如评论中所建议的,对我来说,使用Go 1.16和go install package@version是最好的解决方案。
我的Dockerfile现在看起来像这样:
# syntax = docker/dockerfile:1.0-experimental
# Go build stage
FROM golang:1.16-alpine3.12 AS gobuild
RUN apk add --no-cache git
RUN go install github.com/tool1/tool1@latest
RUN go install github.com/tool2/tool2@latest
RUN go install github.com/tool3/tool3@v1.0.0
# ...https://stackoverflow.com/questions/68576803
复制相似问题