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

在构建 Docker 映像时,我知道我们可以添加一个层来缓存依赖项。但是需要建立依赖关系。此步骤非常耗时,在我的计算机上,仅构建sqlite3大约需要30秒。

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

我在这里发现了同样的问题,但没有答案。


喵喵时光机
浏览 110回答 2
2回答

富国沪深

Docker 在此处提供了有关此确切主题的文档。建议是像这样构建您的结构:DockerfileFROM --platform=${BUILDPLATFORM} docker.io/golang:1.16.7-alpine AS buildARG TARGETOSARG TARGETARCHWORKDIR /srcENV CGO_ENABLED=0COPY go.* .RUN go mod downloadCOPY . .RUN --mount=type=cache,target=/root/.cache/go-build \GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o /out/example .FROM scratchCOPY --from=build /out/example /其中很多都是样板文件,如果您只为单个体系结构构建,则可以将其删除;与缓存相关的部分实际上只是:FROM docker.io/golang:1.16.7-alpine AS buildWORKDIR /srcCOPY go.* .RUN go mod downloadCOPY . .RUN --mount=type=cache,target=/root/.cache/go-build go build -o /out/example .FROM scratchCOPY --from=build /out/example /这会在 上挂载一个缓存目录,这是构建缓存的默认位置。首次构建映像时,它将填充此缓存。后续生成将重用缓存的文件。/root/.cache/go-buildgo为此,必须使用 进行构建,即:DOCKER_BUILDKIT=1DOCKER_BUILDKIT=1 docker build -t myimage .或使用 :docker buildxdocker buildx build -t myimage .我已经在本地对此进行了测试,它似乎按预期工作(我已经验证了在第一个构建之外的构建中,缓存目录是在运行之前填充的)。go-buildgo build

慕的地10843

这不会在 Docker 中进行测试,但应该可以正常工作。不过,它可能会进一步优化,或者进行修改以在更有限的构建环境中工作。RUN&nbsp;go&nbsp;mod&nbsp;download&nbsp;&&&nbsp;go&nbsp;list&nbsp;-f&nbsp;'{{&nbsp;join&nbsp;.Deps&nbsp;"\n"&nbsp;}}'&nbsp;./...&nbsp;|&nbsp;sort&nbsp;-u&nbsp;|&nbsp;grep&nbsp;-v&nbsp;'<your&nbsp;package&nbsp;import&nbsp;path>'&nbsp;|&nbsp;xargs&nbsp;go&nbsp;build
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go