根据 Go 官方文档[1]的描述:
"The go command caches build outputs for reuse in future builds."
Go 命令会缓存构建输出,以便在将来的构建中重用。
这意味着第一次运行 go build
将花费最长的时间,但所有后续的构建都将使用缓存以减少构建时间。
Dockerfile without caching
让我们看一下这个Dockerfile:
FROM golang:1.21-bullseye as builder
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -o app
FROM ubuntu:22.04
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/app .
ENTRYPOINT ["./app"]
这个Dockerfile使用了2种状态:
-
第一阶段负责下载依赖项并构建二进制应用程序。 -
第二阶段将这个二进制应用程序复制到一个干净的Ubuntu镜像中。
虽然这种方法有助于在未更改时缓存某些层级,但每次构建这个镜像时,Docker 都会创建一个新的环境。这意味着 go build
命令将重新构建而不使用缓存。项目中包含的依赖越多,构建过程就越长。
在普通的 “Hello world!”示例中,完成构建过程需要 26 秒。
Docker cache mount
Cache mounts 允许你指定一个持久的包缓存,用于在构建过程中使用。持久的缓存有助于加快构建步骤,特别是涉及使用包管理器安装包的步骤。对于包的持久缓存意味着,即使重新构建一个层级,用户也只需下载新的或已更改的包。
使用 –mount 标志与 Dockerfile 中的 RUN 指令一起创建缓存挂载。要使用缓存挂载,标志的格式为 –mount=type=cache,target=
在使用挂载标志后的 Dockerfile 如下所示:
FROM golang:1.21-bullseye as builder
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
ENV GOCACHE=/root/.cache/go-build
RUN --mount=type=cache,target="/root/.cache/go-build" go build -o app
FROM ubuntu:22.04
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/app .
ENTRYPOINT ["./app"]
应用挂载缓存后,完成构建过程仅需 1.2 秒。
References
-
https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching -
https://docs.docker.com/build/guide/mounts/
build cache: https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching
原文始发于微信公众号(Go Official Blog):让你的 Golang 应用 Dokcer Build Image 加速 20X
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/259024.html