Docker で gradle build を実行すると、Starting a Gradle Daemon で 1 分近くかかってしまう。
適当に gradle clean などをあらかじめ実行しておく
# DockerfileFROM gradleCOPY build.gradle.kt build.gradle.kt+ RUN gradle cleanCOPY src srcRUN gradle build
Daemon 起動中の出力を見る限り、依存関係の計算やダウンロード、build.gradle.kt のコンパイルに時間がかかっているように見える。一度 gradle clean を実行することによって、gradle build の実行時にはそれらを回避できる。また、src/ 以下を変更しただけの場合 RUN gradle clean はキャッシュが利用できるため、初回ビルドより後では高速にビルドできる。
簡単な Hello, world! コードで検証した。次に記載するファイル以外は IntelliJ IDEA で生成されたものをそのまま使用した。
# src/main/kotlin/xyz/comame/test/Main.ktpackage xyz.comame.testfun main() {println("Hello,world!")}
# DockerfileFROM gradleRUN useradd -m userUSER userWORKDIR /home/userCOPY gradle.properties gradle.propertiesCOPY settings.gradle.kts settings.gradle.ktsCOPY build.gradle.kts build.gradle.ktsRUN gradle cleanCOPY src srcRUN gradle build
RUN gradle clean を追加した場合、RUN gradle clean は 49 秒、RUN gradle build は 18 秒かかった。一方、追加しなかった場合、RUN gradle build は 56 秒かかった。
src/main/kotlin/xyz/comame/test/Main.kt の Hello, world! の文字列を変更して再度ビルドした。docker build のキャッシュは有効である。
RUN gradle clean を追加した場合、RUN gradle clean はキャッシュが使用され、RUN gradle build は 18 秒かかった。一方、追加しなかった場合、RUN gradle build は 1 分 3 秒かかった。
複数回測定を繰り返した場合でも、上記とおおむね同様の結果を得られた。
Dockerfile に USER root 、WORKDIR /root を指定した場合、RUN gradle build は高速化されなかった。root ユーザーでは効果がないのか、WORKDIR /root の場合に問題があるのか、あるいは他に原因があるのか、今回は未検証である。