Docker コンテナに Android SDK をインストールする方法

Android の開発環境を Docker コンテナにしたかったので Dockerfile を書いたのですが、意外とハマったのでここにメモを残しておきます。


1. まず Base とするイメージは、初心者なので phusion/baseimage とします。


Docker 初心者は phusion/baseimage-docker を使おう | diaspora

FROM phusion/baseimage:latest


2. Android SDKJava を必要とするため、Java をインストールします。以下のような行を Dockerfile に書きます。

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 ppa:webupd8team/java && \
    apt-get update && \
    apt-get install -y \
        oracle-java8-installer \
        oracle-java8-set-default \
        unzip \
        wget

最初の 2 つの echo は、Java のライセンスを受け入れることを示すためのコマンドです。
普通に apt-get で Java をインストールしようとするとライセンス条項を読んでインタラクティブに y キーを押さないといけないのですが、Docker イメージをビルドするためにはそのようなインタラクティブな処理はスキップしたいのでこのような行が必要です。
そのあとの add-apt-repository コマンドでは Java をインストールするためのリポジトリを追加しています。

apt-get install でインストールしているのは Oracle Java 8 の他に、unzip と wget も後ほど使うのでここでインストールしておきます。


3. Android SDK をダウンロードするため、以下のような行を Dockerfile に書きます

RUN wget https://dl.google.com/android/adt/adt-bundle-linux-x86_64-20140702.zip -O /tmp/adt-bundle-linux-x86_64-20140702.zip

なお、ADT Bundle ではなく、standalone の SDK をダウンロードしても良いと思います。
その場合は zip ではなくtar なので unzip コマンドはインストールしなくても良いと思います。


4. ダウンロードした SDK の ZIP ファイルを展開して /android/sdk ディレクトリに配置するため、以下の様な行を Dockerfile に書きます。

RUN unzip /tmp/adt-bundle-linux-x86_64-20140702.zip
RUN mkdir /android && mv adt-bundle-linux-x86_64-20140702/sdk /android/


5. Android SDK をセットアップするために以下のような行を Dockerfile に書きます。

RUN (sleep 5; while [ 1 ]; do sleep 1; echo y; done ) | /android/sdk/tools/android update sdk --no-ui --filter platform,tool,platform-tool
RUN echo 'export ANDROID_HOME=/android/sdk' >> /root/.bashrc

1行目は android update sdk コマンドを実行して SDK の内容を更新(初回の更新なので実質インストール)をしているのですが、これが --no-ui オプションを指定してもライセンスを受け入れるかどうかを問い合わせてくるため強制的に y を何度も入力するために1秒おきにループして y を echo しています。

2行目ではログインして android 関連のコマンドを使うときのために .bashrc に ANDROID_HOME 変数を設定する行を書き込んでいます。
(PATH の設定なども必要に応じてここでやると良いと思います。)


6. 最後に /tmp などをクリアして終了

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ここまでクリアすると、あとからこのコンテナに入って apt-get install で何かをインストールしようとした時にパッケージが見つからないというエラーになってしまって焦りますが、apt-get update を一度実行すれば大丈夫です。