登录
首页 >  Golang >  Go问答

进行 dockerized 构建,缓存依赖拉取层

来源:stackoverflow

时间:2024-04-11 16:45:36 370浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《进行 dockerized 构建,缓存依赖拉取层》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我使用 skaffold 开发一些 kubernetes 服务度过了一段愉快的时光,但我周期中最长的步骤之一是提取容器的所有依赖项。

有人对如何最好地缓存层中的所有依赖项有建议吗?是否有在 docker 容器内构建 go 二进制文件的最佳实践?我应该有一个层来执行 go get 吗? (而且我是一个构建 go 二进制文件的新手,还不知道所有的花里胡哨。)


解决方案


在谷歌搜索更多内容后,我发现了这篇文章,其中涵盖了该过程:Using go mod download to speed up Golang Docker builds

该技巧的要点是将 go.modgo.sum 文件复制到容器中,然后运行 ​​go mod download 以下载依赖项,然后在另一个步骤中继续构建。

这之所以有效,是因为除非您添加更多依赖项,否则您的 go.modgo.sum 文件不会发生更改。因此,当下一个 run 语句发生时(即 go mod download),docker 知道它可以缓存这一层。 (Source

from golang:1.13.9-buster as builder

# make build dir
run mkdir /build
workdir /build

# copy golang dependency manifests
copy go.mod .
copy go.sum .

# cache the downloaded dependency in the layer.
run go mod download

# add the source code
copy . .
# build
run go build -o app

# run
from debian:buster-slim
copy --from=builder /build
workdir /app
cmd ["./app"]

我在将 skaffoldkubebuilder 集成时遇到了完全相同的问题,彻底解决此问题的想法是:

  1. 安装buildkit,例如:brew install buildkit;

  2. 要通过以下方式启用 skaffold 进行本地构建:

apiversion: skaffold/v1beta9
kind: config
build:
  local:
    usebuildkit: true
    usedockercli: true
...
  1. 编辑 dockerfile 以启用它:
# syntax=docker/dockerfile:experimental

# Build the manager binary
FROM golang:1.12.5 as builder

...
# Build
#RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -o manager main.go
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -o manager main.go
...

然后,第一次它仍然会下载每个依赖项,但之后它将使用缓存,这大大加快了构建过程。

终于介绍完啦!小伙伴们,这篇关于《进行 dockerized 构建,缓存依赖拉取层》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>