首页 > 解决方案 > 在单独的 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,但从未设法获得有效的咒语。

标签: dockergodockerfilego-modules

解决方案


我有一个讨厌的 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 .

推荐阅读