Утилита Android SDK для установки в Docker не работает

Я пытаюсь сделать изображение докеров, которое я могу использовать для создания проектов Android, используя Shippable.

Проблема заключается в команде 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

Я нашел несколько решений здесь: qaru.site/info/29838/..., но он для Windows и, похоже, не исправляет проблему с Linux. Похоже, что во время команды обновления текущий каталог используется и поэтому не может быть переименован.

Мое обходное решение sofar, используя это workaroundsuggestion, заключается в следующем:

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

Чтобы автоматически принять лицензию, я echo 'y' для команды android.

Но я думаю, что команда android должна также запускаться в правильном каталоге, а именно, почему я cd в нее сначала.

Но все равно не получается. Я довольно зациклен на том, как исправить эту проблему, поэтому любая помощь приветствуется.

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

Я запускаю команду android sdk update без фильтра tools, и в итоге мои сборки gradle успешны. Поэтому я не знаю точно, не проблема ли их обновить...

Ответ 1

Это можно решить, объединив все команды Android SDK в одной команде Dockerfile RUN. Это как-то связано с файловой системой Docker.

Подробное объяснение из сообщения о проблеме Tracker для Android Open Source Project:

Проблема возникает при запуске обновления SDK в Docker контейнер. Docker использует специальную файловую систему, которая работает как версия (например, git) и записывает все изменения, внесенные в файловая система. Проблема в том, что обновление SDK использует перемещение жесткой ссылки для перемещения каталога "tools", который не поддерживается лежащей в основе файловой системы Docker.

Решение для этого - просто запустить все команды Android SDK в одиночная команда "RUN" в Docker. Таким образом, движение жесткой линии работает как нормальный, если вы не используете операцию "перемещение жесткой линии" между многократная команда RUN (моментальные снимки). Преимуществом этого является то, что ваши слои Docker будут меньше (по сравнению с запуском нескольких отдельные команды RUN).

Вот строка из файла Docker:

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)

Ответ 2

Это то, что в настоящее время работает для меня, вы можете увидеть, что команда обновления успешно работает ниже. В моей среде это 3 разных изображения докеров в одной иерархии FROM, поэтому вы можете совместить множество 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