docker - 在单独的 Docker 层中构建 go 依赖项
问题描述
我正在尝试加快我的 Go 应用程序的 Docker 构建速度。现在,它可能花费 60 年代来构建依赖项(它是一个 k8s 控制器,所以有很多)。
一个非常重要的限制:我的项目依赖于私有 GitHub 存储库。我在go mod vendor
外面做docker build
,我在那里建立了回购协议。
我现在的 Dockerfile 大致是:
FROM golang:1.12
WORKDIR /src
COPY . .
RUN go build -mod=vendor
...
即使不必下载 deps,该构建也需要一段时间,因为它会在每个docker build
.
我想做的是:
FROM golang:1.12
WORKDIR /src
# these shouldn't change very often
COPY go.mod go.sum vendor ./
RUN go build -mod=vendor <all dependency packages>
COPY . .
RUN go build -mod=vendor
...
我尝试了 parsing go.mod
,但当然列出了模块,而不是包。我尝试过go list
,但从未设法获得有效的咒语。
解决方案
我有一个讨厌的 hack 似乎有效:
FROM golang:1.12
WORKDIR /src
COPY go.mod go.sum ./
COPY vendor/ ./vendor
RUN go build -mod=vendor $(cat deps|grep -v mypackage | grep -v internal)
COPY . .
RUN go build -mod=vendor
...
go list -f '{{join .Deps "\n"}}' > deps
docker build .
推荐阅读
- apache-spark - Windows 10 上的 pyspark 安装失败
- javascript - 如何使用 react.js 从 RESTAPI 获取数据
- c# - 如何在 AppCenter SDK for C# 中为 TrackError 注册事件处理程序?
- c# - 将表格元素加载到组合框中
- javascript - fs.opensync 不是函数
- codenameone - 代号一中的Android清单合并错误
- html - 将 Excel 文件内容显示为 HTML 表格 Angular
- c - GCC 中 strftime 的自定义语言环境字符串
- javascript - 是否保证在客户端智能支付按钮 .then() 之后会触发 webhook?
- mysql - MySQL 使用 leftjoin 和 select