参考にしました: 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
オプションが使えるかもしれない。