登录
首页 >  Golang >  Go问答

使用 go.mod 将构建的模块下载到 GOBIN 以进行 Docker 缓存

来源:stackoverflow

时间:2024-04-11 23:27:34 453浏览 收藏

本篇文章向大家介绍《使用 go.mod 将构建的模块下载到 GOBIN 以进行 Docker 缓存》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

我有一个多阶段 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 模块。

go.mod 文件对我来说是一个很好的解决方案,因为它指出了确切的模块版本;因此,当使用 docker 时,缓存会变得更加简单,因为层可以重复使用,除非 go.mod 发生更改。

我可以通过运行 go mod init github.com/me/myproject 轻松实现此目的,然后后续 go get 调用将相关模块添加到 go.mod

但我缺少最后一部分,类似于 go mod download 但具有与 go get 相同的“输出”,它将构建的二进制文件保存到 gobin

澄清一下,我使用的是用 go 构建的工具的二进制文件,但我的项目本身不是 go 应用程序,它只使用这些工具。


正确答案


正如评论中所建议的,使用 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/[email protected]

# ...

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>