我有一个配置为构建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
答案 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
目录来解决了此问题。这样,映像本身在每次运行时都是新鲜的,但是缓存在运行之间共享。这确实意味着您仍然需要对每台主机进行初始缓慢的运行,但这会大大减少后续运行所需的时间。
根据您要尝试执行的操作,这可能是令人满意的解决方案,也可能不是令人满意的解决方案。