在Docker中安装Android SDK工具失败

我正在尝试使用Shippable来构build一个Docker图像,以便构buildAndroid项目。

问题是android update sdk命令,它给出了以下错误:

 Installing Android SDK Tools, revision 24.2 Failed to rename directory /opt/android-sdk-linux/tools to /opt/android-sdk-linux/temp/ToolPackage.old01. Failed to create directory /opt/android-sdk-linux/tools 

我在这里find了一些解决scheme: https : //stackoverflow.com/a/8839359/867099,但它是为Windows,似乎并没有解决在Linux上的问题。 看来在更新命令期间,当前目录正在使用,因此不能被重命名。

我的解决方法是使用这个工作区请求,是这样的:

 RUN cp -r /opt/android-sdk-linux/tools /opt/android-sdk-linux/tools_copy RUN cd /opt/android-sdk-linux/tools && echo 'y' | /opt/android-sdk-linux/tools_copy/android update sdk --no-ui -a --filter tools,platform-tools,build-tools-22.0.1,android-21,extra-android-support,extra-google-google_play_services --force 

为了自动接受许可证,我向android命令echo 'y'

但是我认为android命令也应该运行在正确的目录下,这就是为什么我先把它放进去。

但是,它仍然失败。 我相当难以解决这个问题,所以任何帮助表示赞赏。

——更新——–

我没有toolsfilter运行android sdk update命令,最后,我的gradle构build成功。 所以我不确定这是否是一个问题,不更新它们…

这可以通过在一个Dockerfile的RUN命令中结合所有的Android SDK命令来解决。 这与Docker的文件系统有关。

有关Android开放源代码项目Issue Tracker 的post的详细解释:

在Docker容器中运行SDK更新时会导致问题。 Docker使用一个特殊的文件系统,它像一个版本控制系统(例如git)一样工作,并logging对文件系统所做的所有更改。 问题是SDK更新使用硬链接移动操作来移动Docker文件系统不支持的“工具”目录。

解决scheme是在Docker中的一个“运行”命令中运行所有的Android SDK命令。 这样,只要不使用多个RUN命令(快照)之间的“硬链接移动”操作,硬链接移动就可以正常工作。 这样做的好处还在于,Docker层将会更小(与运行多个独立的RUN命令相比)。

这是Dockerfile中的一行:

 RUN wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz && \ tar xzf android-sdk_r24.4.1-linux.tgz && \ rm android-sdk_r24.4.1-linux.tgz && \ (echo y | android-sdk-linux/tools/android -s update sdk --no-ui --filter platform-tools,tools -a ) && \ (echo y | android-sdk-linux/tools/android -s update sdk --no-ui --filter extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository -a) && \ (echo y | android-sdk-linux/tools/android -s update sdk --no-ui --filter build-tools-23.0.2,android-24 -a) 

这是目前正在为我工​​作,你可以看到更新命令成功运行下面。 在我的环境中,这是一个FROM层次结构中的3个不同的docker镜像,所以如果不是这样的话,你可能会组合大量的apt-get

 FROM ubuntu:14.04 # Set debconf to run non-interactively RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections # Install base dependencies RUN apt-get update && apt-get install -y -q --no-install-recommends \ apt-transport-https \ build-essential \ ca-certificates \ curl \ git \ libssl-dev \ python \ rsync \ software-properties-common \ wget \ && rm -rf /var/lib/apt/lists/* # Install the JDK RUN echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \ echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections && \ add-apt-repository -y ppa:webupd8team/java && \ apt-get update -qq && \ DEBIAN_FRONTEND=noninteractive apt-get install -qqy --force-yes oracle-java7-installer && \ rm -rf /var/lib/apt/lists/* /var/cache/oracle-jdk7-installer # Install Android Dev Tools RUN apt-get update && apt-get install -y -q --no-install-recommends \ lib32ncurses5 \ lib32stdc++6 \ lib32z1 \ libswt-gtk-3-java \ unzip \ && rm -rf /var/lib/apt/lists/* RUN wget -qO- "http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz" | tar -zxv -C /opt/ RUN cd /opt/android-sdk-linux/tools/ && \ echo y | ./android update sdk --all --filter platform-tools,build-tools-20.0.0,android-17,sysimg-17,system-image,extra-android-support --no-ui --force ENV PATH /opt/android-sdk-linux/build-tools/20.0.0:$PATH