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

Android 每次执行docker run./gradlew命令时,它都会下载所有gradle文件和依赖项。如何只下载和安装一次?,android,docker,gradle,gradlew,Android,Docker,Gradle,Gradlew,我有一个简单的dockerfile,配置为构建android应用程序 这一切都运行得很好,但问题是每次我运行/gradlew命令时,它都会下载并安装所有的Gradle工件和依赖项。如何只安装一次 这是dockerfile: FROM openjdk:8 ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" \ ANDROID_HOME="/usr

我有一个简单的dockerfile,配置为构建android应用程序
这一切都运行得很好,但问题是每次我运行
/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

毫无疑问,正如您所发现的,问题在于,枚举所有Gradle任务的所有可能依赖项并下载它们是非常重要的

这不是最优雅的解决方案,但我以前(在GitLab CI Docker runners的上下文中)通过在主机上挂载一个目录作为目录解决了这个问题。这样,映像本身在每次运行时都是最新的,但缓存是跨运行共享的。这确实意味着每个主机的初始运行速度仍然很慢,但它大大减少了后续运行所需的时间


这可能是一个令人满意的解决方案,也可能不是一个令人满意的解决方案,具体取决于您正尝试执行的操作。

根据Dockerfile,gradle的缓存目录为
/root/.gradle
。因此,您需要将卷装载到缓存目录以持久化缓存

  • 使用主机卷
docker run-it--rm-v$PWD/.gradle:/root/.gradle-v$PWD:/application packsdkandroiddocker.image bash./gradlew assembleDebug
  • 使用命名卷
docker卷创建渐变缓存
docker run-it--rm-v gradle cache:/root/.gradle-v$PWD:/application packsdkandroiddocker.image bash./gradlew assembleDebug

谢谢,这很有帮助,我如何才能使新创建的$PWD/.gradle在创建时不成为root用户?使用此环境变量
gradle\u USER\u HOME
指定您想要的缓存目录?从docker那里传来的