LoginSignup
2
2

More than 5 years have passed since last update.

Dockerのイメージのビルド時にMavenの依存ライブラリをキャッシュさせたい

Last updated at Posted at 2019-01-13

参考にしました: https://whitfin.io/speeding-up-maven-docker-builds/

実行時(docker run)ではなくイメージのビルド時(docker build)の話です。

行きついた答えは以下です。

Dockerfile
# pom.xmlをコピーする(pom.xmlが変化した場合は再ビルドを許容する)
COPY /path/to/pom.xml pom.xml

# プロジェクトの依存関係とMaven pluginの依存関係も含める場合は、実際に使うゴールを書く。
# cleanは最後に持ってくると、成果物を消してくれるので無駄が減ってより良い
RUN mvn package clean

# プロジェクトの依存関係だけであればこっちでよい
RUN mvn dependency:go-offline

# 以降は普通のbuild or run用のコマンドが続く...

dependency:go-offlineはプロジェクトの依存関係を見てくれるが、ゴールの実行に必要なプラグインの依存関係までは見てくれない。
これはゴール実行時でないとわからないようなので、ゴールを書いている。

他にやり方無いんか?というと、実行時ならボリュームをマウントする方法が使える。
しかしコンテナで動くCIサービスにはマウントできる永続ボリュームが無いため毎回使い捨てることになる。
そうなるとMavenのキャッシュの仕組みが機能しなくなってしまうので、コードを1行直すだけなのに、毎回プラグインや依存ライブラリのダウンロードを行ってしまい、反映に時間がかかり辛くなる。
なので、イメージに含めてしまおうという考え。ビルド用のイメージならサイズが大きくても多少はよいので。

あと、ゴールによっては失敗する可能性もある。そのときは失敗を無視する--fail-neverオプションが使えるかもしれない。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2