使用 go mod download 加速 docker 编译

96
siddontang 595a1b60 08f6 4beb 998f 2bf55e230555
0.6 2019.01.06 21:40 字数 327

这几天在折腾 go-ycsb 的 docker 环境的时候,一直被一件简单的事情困扰,就是升级了 go 使用了 go mod 之后,已经没有 vendor 了,那么每次在 docker 里面编译 go-ycsb 的时候,都会重新去下载需要的依赖。这个其实是很坑爹的一个事情。所以我在想有没有办法能把依赖缓存起来。

首先我做了如下改动:

ADD . /go/src/github.com/pingcap/go-ycsb
RUN GO111MODULE=on go mod download
WORKDIR /go/src/github.com/pingcap/go-ycsb
RUN GO111MODULE=on go build -o /go-ycsb ./cmd/*

也就是希望在编译的时候,先使用 go mod download 将所需要的依赖给下载下来,但这个其实是不行的,每次仍然都需要下载编译依赖。原因也很好解释,主要是 ADD . /go/src/github.com/pingcap/go-ycsb 这一步会把 docker 的 cache 给清掉,毕竟代码有更新了。

那么我们要如何才能先缓存需要的依赖呢?这个其实也挺简单的,我们先把 go mod 需要的两个文件 copy 到 docker 里面,然后 go mod download,就可以了,如下:

WORKDIR /go/src/github.com/pingcap/go-ycsb

COPY go.mod .
COPY go.sum .

RUN GO111MODULE=on go mod download

COPY . .

RUN GO111MODULE=on go build -o /go-ycsb ./cmd/*

只有当我们的 mod 文件重新更新之后,cache 才会失效,然后重新 download。搞定了这个问题,go-ycsb 的 docker 编译也快了很多。

编程之路
编程之路
22.0万字 · 49.2万阅读 · 316人关注
Gupao