TL;DR
docker buildの高速化。
Gopkg.toml
とGopkg.lock
に変更がない場合はキャッシュが利用されてビルドの時間を短縮できる。
FROM golang:1.10
WORKDIR /go/src/github.com/munisystem/test
COPY Gopkg.toml Gopkg.lock ./
RUN dep ensure -v -vendor-only=true
COPY . .
RUN dep ensure -v
RUN go build
解説
docker build
のCOPY
及びADD
のレイヤでキャッシュが効くか否かは対象のfileのhash値によって決まる。
例えばRailsアプリケーションのDockerfileでは以下のような記述が多く見受けられる。
FROM ruby:2.5.0
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY . .
こういったDockerfileを書くことにより、コードベースに変更を加えてもGemfile
とGemfile.lock
に変更がない限りbundle installをスキップすることが出来る。
ではGolangのパッケージ管理ツールであるdepではどうだろうか。
dep ensure
はGopkg.toml
Gopkg.lock
の他にGoのコードから依存を解決しようとするため、カレントに対象となるファイルがない場合は実行に失敗してしまう。
-vendor-only=true
をビルドの引数として与えると、Goのコードは一切参照せずにGopkg.lock
から依存を引っ張ってきてくれる。
これを利用してdep ensure
による大量の依存関係のダウンロードにキャッシュを効かせるのが今回のアプローチ。