尝试为Android项目构建dockerfile时出错

时间:2020-07-22 09:24:49

标签: android docker

我正在尝试为用于CI配置的Android项目构建映像(这将是我的管道中的第一步)

我正在尝试运行以下命令:

docker build -t android-build:some-name -f Dockerfile .

下面是我的Dockerfile:

FROM openjdk:11.0.7

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

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

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

我收到如下错误:

  Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
11:11:42
    at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
11:11:42
    at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
11:11:42
    at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
11:11:42
    at com.android.sdklib.tool.SdkManagerCli.main(SdkManagerCli.java:117)
11:11:42
    at com.android.sdklib.tool.SdkManagerCli.main(SdkManagerCli.java:93)
11:11:42
  Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
11:11:42
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
11:11:42
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) [0m [91m
11:11:42
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
11:11:42
    ... 5 more
11:11:42
  The command '/bin/sh -c 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' returned a non-zero code: 1
11:11:42
   [0m

我还在尝试其他配置:

FROM openjdk:11.0.7

ENV SDK_URL="https://dl.google.com/android/repository/commandlinetools-linux-6604631_latest.zip" \
    ANDROID_HOME="/usr/local/android-sdk" \
    ANDROID_VERSION=29 \
    ANDROID_BUILD_TOOLS_VERSION=28.0.3 \

RUN mkdir "$ANDROID_HOME" .android \
    && cd "$ANDROID_HOME" \
    && curl -o sdk.zip $SDK_URL \
    && unzip sdk.zip \
    && rm sdk.zip

RUN yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --licenses

RUN $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --update

RUN yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME \
    "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
    "platforms;android-${ANDROID_VERSION}"

RUN mkdir /application

WORKDIR /application

但这给我一个如下错误:

  Error response from daemon: failed to parse Dockerfile: Syntax error - can't find = in "RUN". Must be of the form: name=value
11:22:51
  Process exited with code 1

不幸的是我不是DevOps家伙,所以我的配置出了什么问题? 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您有两种方法可以解决此问题

  • 降级JDK,以便您拥有SDK所需的模块,因为这些模块已在JDK 9+中删除
  • 或使用适用于JDK 9+的新SDK
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=29 \
    ANDROID_BUILD_TOOLS_VERSION=28.0.3

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

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

或者您可以在此查找新的SDK

Google一直在开发新的Android SDK命令行工具版本,该版本可在当前JVM(9、10、11+)上运行,并且不依赖于已弃用的JAXB EE模块!

SDK Tools for Linux