2015-05-18 9 views
11

Próbuję utworzyć obraz dokowania, za pomocą którego będę mógł budować projekty Android, korzystając z opcji Przesyłka.Narzędzia Android SDK instalowane w Dockerze ulegają awarii

Problem jest polecenie android update sdk, co daje następujący błąd:

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 

znalazłem nieco roztworu tutaj: https://stackoverflow.com/a/8839359/867099 ale dla Windows, i nie wydaje się, aby rozwiązać ten problem w systemie Linux. Wygląda na to, że podczas aktualizacji polecenie bieżący katalog jest używany i dlatego nie można zmienić jego nazwy.

Moja obejście dalece, przy użyciu tego workaroundsuggestion, to:

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 

Aby automatycznie zaakceptować licencję, ja echo 'y' do polecenia android.

Ale myślę, że polecenie android powinno również działać w poprawnym katalogu, dlatego najpierw należy do niego I cd.

Ale nadal nie działa. Jestem raczej zaskoczony, jak rozwiązać ten problem, więc każda pomoc jest doceniana.

------ UPDATE --------

uruchomić komendę android sdk update bez filtra tools, a na koniec, mój Gradle opiera się to udaje. Tak więc nie wiem na pewno, czy nie jest to problem, aby ich nie aktualizować ...

+1

- spróbuj 'adb kill-server' zanim uruchomisz polecenie' android update sdk'. Lub sprawdź, czy istnieją inne działające procesy, które mogą odwoływać się do tego katalogu. – CommonsWare

+0

Myślę, że to rzeczywiście '' 'adb'''' uzyskuje dostęp do katalogu, ale jest uruchamiany po uruchomieniu polecenia update. Więc nie wydaje się możliwe zabicie go na czas. – xorgate

+0

Może być powiązany ze sterownikiem pamięci zgodnie z tym https://github.com/travis-ci/travis-ci/issues/2848 – shbi

Odpowiedz

0

To jest to, co aktualnie dla mnie działa, można zobaczyć polecenie aktualizacji działające z powodzeniem poniżej. W moim środowisku są to 3 różne obrazy dokowane w jednej hierarchii FROM, więc możesz prawdopodobnie połączyć wiele z apt-get s, jeśli to nie twoja sprawa.

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 
+3

twoje polecenie' ./android update sdk' tak naprawdę nie aktualizuje pakietu "Android SDK Tools" (opcja 'tools' dla' --filter'), które OP ma problem z instalacją. –

+0

Dlaczego używasz flagi '--force'? –

9

Problem ten można rozwiązać przez połączenie wszystkich Android polecenia SDK RUN polecenia JEDNEGO Dockerfile'S. Ma to coś wspólnego z systemem plików Docker.

Szczegółowe wyjaśnienie od a post wystawienia Tracker dla Android Open Source Project: „Wydaje się, że podczas polecenia aktualizacji, bieżący katalog jest w użyciu i dlatego nie może być zmieniona na”

The problem is caused when you run the SDK update in a Docker container. Docker uses a special filesystem which works like a version control system (e.g. git) and records all changes made to the filesystem. The problem is that the SDK update uses a hardlink move operation to move the 'tools' directory, which is not supported by the underlying Docker filesystem.

The solution for this is to simply run all Android SDK commands in a single 'RUN' command in Docker. That way, the hardlink move works as normal, as long as you don't use the 'hardlink move' operation between multiple RUN command (snapshots). The advantage of this is also that your Docker layers will be smaller (compared to running multiple seperate RUN commands).

Here is the line from the 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) 
+0

Dlaczego ** build-tools-23.0.2 **, a nie ** 25.0.0 **? –

+1

@IgorGanapolsky 25.0.0 nie był w tym czasie dostępny. https://developer.android.com/studio/releases/build-tools.html –

+0

Cóż, nie powiedziałbym, że nie ma to nic wspólnego z Dockerem, jeśli "aktualizacja SDK używa operacji przeniesienia hardlink do przeniesienia katalogu" tools ", który nie jest obsługiwany przez bazowy system plików Docker." –

Powiązane problemy