Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓sdk工具上的标签太多不匹配,可以';构建docker映像_Android_Docker_Shell - Fatal编程技术网

Android 安卓sdk工具上的标签太多不匹配,可以';构建docker映像

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}

我在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} \
    && 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