這幾天在折騰 go-ycsb 的 docker 環(huán)境的時候,一直被一件簡單的事情困擾,就是升級了 go 使用了 go mod 之后,已經(jīng)沒有 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 編譯也快了很多。