让你的 Golang 应用 Dokcer Build Image 加速 20X


根据 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/
参考资料
[1]

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

(0)
土豆大侠的头像土豆大侠

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!