每次执行docker run ./gradlew命令时,它都会下载所有gradle文件和依赖项。如何仅下载和安装一次?

时间:2020-08-05 06:41:19

标签: android docker gradle gradlew

我有一个配置为构建android应用的简单dockerfile
一切正常,但是问题是每次我运行./gradlew命令时,它都会下载并安装所有Gradle工件和依赖项。我怎样才能安装一次?

这是dockerfile:

FROM openjdk:8

ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" \
    ANDROID_HOME="/usr/local/android-sdk" \
    ANDROID_VERSION=26 \
    ANDROID_BUILD_TOOLS_VERSION=26.0.2

# Download Android SDK
RUN mkdir "$ANDROID_HOME" .android \
    && cd "$ANDROID_HOME" \
    && curl -o sdk.zip $SDK_URL \
    && unzip sdk.zip \
    && rm sdk.zip \
    && yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses

# Install Android Build Tool and Libraries
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
    "platforms;android-${ANDROID_VERSION}" \
    "platform-tools"

RUN mkdir /application
WORKDIR /application

这是命令:

docker run -it --rm -v "$PWD":/application packsdkandroiddocker.image bash  ./gradlew assembleRelease --debug

2 个答案:

答案 0 :(得分:1)

基于Dockerfile,gradle的缓存目录为create(attributes: any[] = null): this { ... 。因此,您需要将卷安装到缓存目录以持久化缓存。

  • 使用主机卷
/root/.gradle
  • 使用命名卷
docker run -it --rm -v $PWD/.gradle:/root/.gradle -v $PWD:/application packsdkandroiddocker.image bash ./gradlew assembleDebug

答案 1 :(得分:0)

毫无疑问,问题是,枚举所有Gradle任务的所有可能依赖项并下载它们……是不平凡的。

这不是最优雅的解决方案,但是我之前(在GitLab CI Docker运行程序的上下文中)已经通过将主机上的目录装载为GRADLE_USER_HOME目录来解决了此问题。这样,映像本身在每次运行时都是新鲜的,但是缓存在运行之间共享。这确实意味着您仍然需要对每台主机进行初始缓慢的运行,但这会大大减少后续运行所需的时间。

根据您要尝试执行的操作,这可能是令人满意的解决方案,也可能不是令人满意的解决方案。