Android 安卓sdk工具上的标签太多不匹配,可以';构建docker映像
我在docker上运行此命令以安装一些android sdk组件:Android 安卓sdk工具上的标签太多不匹配,可以';构建docker映像,android,docker,shell,Android,Docker,Shell,我在docker上运行此命令以安装一些android sdk组件: RUN mkdir ${ANDROID_HOME} && wget --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip \ && unzip android-sdk.zip -d ${ANDROID_HOME}
RUN mkdir ${ANDROID_HOME} && wget --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip \
&& unzip android-sdk.zip -d ${ANDROID_HOME} \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} --list \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "build-tools;25.0.1" \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "build-tools;28.0.3" \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "build-tools;29.0.2" \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "platform-tools" \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "platforms;android-25" \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "platforms;android-28" \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "platforms;android-30" \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "extras;android;m2repository" \
&& echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "extras;google;google_play_services" \
&& ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "ndk;${ANDROID_NDK_VERSION}" \
&& ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "cmake;3.10.2.4988404" \
&& yes | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} --update
因为它是一个docker图像,所以我必须在同一个命令中运行所有内容,否则图像将有太多额外的层并占用太多的空间
问题是,由于不可靠的internet,我很可能在安装这些组件时遇到标签不匹配的情况,这使得我不得不再次运行该过程。我必须构建我的docker映像30多次,才能让它成功地执行所有命令
有没有办法在android sdk中重试标记不匹配
我还想过尝试单独运行每一行,但仍然在一个大命令中运行
也许吧
通过创建一个执行while
循环的函数,在.sh文件上实现这一点很容易,但是如果我想在Dockerfile中执行所有操作,该怎么办
有人有更好的想法吗?免责声明:我不知道你的命令在做什么(除了下载android sdk),因此你可能需要稍微修改我的代码才能让它正常工作。此外,您的图像可能不包含超时
首先,我将首先将您的脚本移动到一个单独的文件中,与您的Dockerfile
位于同一目录中,然后像这样执行它:
COPY ./build.sh .
RUN chmod +x ./build.sh && ./build.sh
现在,在脚本中,您可以在继续之前检查每行的输出:
#!/bin/bash
url="https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip"
mkdir ${ANDROID_HOME}
until (
wget --output-document=android-sdk.zip "$url" && \
unzip android-sdk.zip -d ${ANDROID_HOME}
); do
sleep 1
done
args=(
"--list"
"build-tools;25.0.1"
"build-tools;28.0.3"
"build-tools;29.0.2"
"platform-tools"
"platforms;android-25"
"platforms;android-28"
"platforms;android-30"
"extras;android;m2repository"
"extras;google;google_play_services"
)
# you may need to modify this slightly!
for arg in "${args[@]}";
do
until ( echo y | ${SDKMANAGER} --sdk_root=${ANDROID_HOME} "$arg" ); do
sleep 5
done
done
最好设置一个超时,这样构建就不会陷入无限循环。我没有在脚本中添加两个单独的检查,而是将其添加到Dockerfile
:
# might need adjusting
ARG MAX_TIMEOUT=60
COPY ./build.sh .
RUN chmod +x ./build.sh && timeout -k $MAX_TIMEOUT ./build.sh
我建议您将其作为主项目的,而不是将其包含在相同的Dockerfile
中。这样,如果您需要修补项目的Dockerfile
并重新构建,就不必每次都重新构建android sdk
# might need adjusting
ARG MAX_TIMEOUT=60
COPY ./build.sh .
RUN chmod +x ./build.sh && timeout -k $MAX_TIMEOUT ./build.sh