为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
喵喵时光机 2022-09-19 17:36:05
在构建 Docker 映像时,我知道我们可以添加一个层来缓存依赖项。但是需要建立依赖关系。此步骤非常耗时,在我的计算机上,仅构建sqlite3大约需要30秒。我也知道我可以用来构建一个特定的依赖项,但是有没有办法预构建所有依赖项列表?go build github.com/mattn/go-sqlite3go.mod我在这里发现了同样的问题,但没有答案。
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

Docker 在此处提供了有关此确切主题的文档。建议是像这样构建您的结构: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-buildgo


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


DOCKER_BUILDKIT=1 docker build -t myimage .

或使用 :docker buildx


docker buildx build -t myimage .

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


查看完整回答
反对 回复 2022-09-19
?
慕的地10843

TA贡献1785条经验 获得超8个赞

这不会在 Docker 中进行测试,但应该可以正常工作。不过,它可能会进一步优化,或者进行修改以在更有限的构建环境中工作。

RUN go mod download && go list -f '{{ join .Deps "\n" }}' ./... | sort -u | grep -v '<your package import path>' | xargs go build



查看完整回答
反对 回复 2022-09-19
  • 2 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号