制作 Docker 镜像时,需要缓存依赖关系以加快构建过程。本文解决了预构建所有必需模块并缓存它们的问题。
一种方法是在构建映像时添加一个层来缓存依赖项。但是,此步骤需要构建依赖关系,这可能非常耗时。另一种方法是使用 go build 命令。
另一个选项是预先构建 go.mod 文件中列出的所有依赖项。幸运的是,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-build 上的目录,其中包含 go 构建缓存。在初始构建期间,缓存被填充。后续构建将利用缓存的文件。
要激活此功能,请在使用 docker build 命令构建映像时包含 DOCKER_BUILDKIT=1,或使用 docker buildx。测试证实了这种方法的有效性。
以上是如何有效缓存Golang项目的Docker镜像中的依赖关系?的详细内容。更多信息请关注PHP中文网其他相关文章!