在单独的Docker层中构建go依赖项

时间:2019-03-27 19:20:25

标签: docker go dockerfile go-modules

我正在尝试加快Go应用程序的Docker构建速度。现在,仅花60年代就建立了依赖关系(这是一个k8s控制器,所以有很多)。

一个非常重要的约束:我的项目依赖于私有GitHub存储库。我在go mod vendor以外的地方docker build做事,在那里我对回购协议的建立有信心。

我现在的Dockerfile大致为:

FROM golang:1.12

WORKDIR /src

COPY . .
RUN go build -mod=vendor
...

即使无需下载dep,该构建也需要一段时间,因为它每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
...

我尝试解析go.mod,但是当然列出了模块,而不是包。我尝试过go list,但从未设法成功。

1 个答案:

答案 0 :(得分:1)

我有一个令人讨厌的骇客,似乎可以奏效:

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 .