首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用go.mod将构建的模块下载到GOBIN以进行Docker缓存

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

Stack Overflow用户
提问于 2021-07-29 21:27:09
回答 1查看 95关注 0票数 0

我有一个多阶段的Dockerfile文件(uisng BuildKit),其中包含一个初始阶段来go get几个工具,我需要在以后的阶段使用它们作为二进制文件。下面的例子就是它的要点:

代码语言:javascript
复制
# 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应用程序,它只使用这些工具。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-03 09:15:54

正如评论中所建议的,对我来说,使用Go 1.16和go install package@version是最好的解决方案。

我的Dockerfile现在看起来像这样:

代码语言:javascript
复制
# 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

# ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68576803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档