登录
首页 >  Golang >  Go问答

如何预先构建所有需要的模块并缓存它们

来源:Golang技术栈

时间:2023-04-30 15:09:50 239浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《如何预先构建所有需要的模块并缓存它们》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到golang等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

在构建 Docker 映像时,我知道我们可以添加一个层来缓存依赖项。但是需要建立依赖关系。这一步相当耗时,在我的机器上单独构建 sqlite3 大约需要 30 秒。

我也知道我可以go build github.com/mattn/go- sqlite3用来构建特定的依赖项,但是有没有办法预先构建所有依赖项列表go.mod

[我在这里](https://stackoverflow.com/questions/60474679/how-can-i-cache-golang- packages-build-artefacts-for-docker-build)发现了同样的问题,但没有答案。

正确答案

[Docker 在此处](https://www.docker.com/blog/containerize-your-go-developer- environment-part-2/)提供有关此确切主题的文档。建议是这样构建你的Dockerfile

FROM --platform=${BUILDPLATFORM} docker.io/golang:1.16.7-alpine AS build
ARG TARGETOS
ARG TARGETARCH
WORKDIR /src
ENV CGO_ENABLED=0
COPY go.* .
RUN go mod download
COPY . .
RUN --mount=type=cache,target=/root/.cache/go-build \
GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o /out/example .

FROM scratch
COPY --from=build /out/example /

如果您只为单一架构构建,其中很多是可以删除的样板;与缓存相关的部分实际上只有:

FROM docker.io/golang:1.16.7-alpine AS build
WORKDIR /src
COPY go.* .
RUN go mod download
COPY . .
RUN --mount=type=cache,target=/root/.cache/go-build go build -o /out/example .

FROM scratch
COPY --from=build /out/example /

这会在 上挂载一个缓存目录/root/.cache/go- build,这是go构建缓存的默认位置。第一次构建图像​​时,它将填充此缓存。后续构建将重新使用缓存的文件。

为此,您必须使用 构建DOCKER_BUILDKIT=1,即:

DOCKER_BUILDKIT=1 docker build -t myimage .

或使用docker buildx

docker buildx build -t myimage .

我已经在本地对此进行了测试,它似乎可以按预期工作(我已经验证在第一个以外的构建中,go-build缓存目录在运行之前被填充go build)。

本篇关于《如何预先构建所有需要的模块并缓存它们》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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