AlpineベースのAndroidビルド環境のDockerイメージを作成した
なるべく小さく、sdkmanagerにも対応させた、CI用のDockerイメージを作成しました。 Emulatorなどを利用したAndroid Testにはまだ未対応ですが、Unit Testは実行できます。
PublicなDockerHubに上げたかったのですが、ライセンス違反という話があるのでPrivateにしてあります。
↑なぜか画像がアイコンになってくれない。。
詰まったところ
sdkmanagerの実行で失敗
bashも入ってないため、sdkmanagerの実行で失敗します。
sdkmanager: line 159: syntax error: unexpected "(" (expecting "}")
apk add bash
が必要でした。
glibcがない
純粋なAlpineのイメージだと、glibcが入ってないためapptでコケました。
Wikiにインストール方法が載っていたのですが、うまく入れられませんでした。
調べたら、こちら が既にAndroidを動かせる状態であったのですが、glibcだけを入れたイメージがあった ので、そちらをベースに作成することにしました。
内部的にはどちらもこのリポジトリに依存してるみたいです。
sdkmanagerを利用すると怒られる
sdkmanagerを利用するとWarningが表示されました。
Warning: File ~/.android/repositories.cfg could not be loaded.
ファイルを作成することでWarningが消えました。
改善したいところ
SDKも含めると結局大きい
Dockerイメージ自体を置いておけたり、キャッシュを効かせられないと、時間がかかります。 しかし、今まで利用してたイメージのサイズが2GB程度だったのに比べて、今回作成したイメージは1GBを切った(DockerHubのtagの数字)ので、そういう意味では小さくできました。
ライセンス周りの承認をいい感じにしたい
現状は承認ファイルのようなものを固定で入れてます。
しかし、 SDK Toolsの25.3.0から sdkmanager
で承認ファイルを管理できます。
$ sdkmanager --licenses 5 of 5 SDK package licenses not accepted. Review licenses that have not been accepted (y/N)?
あとは y
を数回押すだけで、 $ANDROID_HOME/licenses/
に、承認ファイルが作成されます。
次のようにすれば自動で全部Acceptできるはずです。
$ (while sleep 1; do echo "y"; done) | sdkmanager --licenses
DLできるSDK Toolsが更新されたときに合わせてDockerfileも更新しようと思っています。
作成してみて
なんとなく触ってたDockerも、なるべくレイヤーを少なくすることだったり、registryにpushすることなどができて理解が深まりました。
ただ、ベストプラクティスのようなものがわかっていないので今後利用していきながら修正してければなと思います。
参考
Alpine Linux入門 -内部構造とapkでパッケージインストール編- / tehepero note(・ω<)
お前のDockerイメージはまだ重い💢💢💢 / Speaker Deck
公開用DockerイメージにAndroid SDKを含めるのはライセンス違反という話 / Islands in the byte stream
Running glibc programs / Alpine Linux Wiki
frol/docker-alpine-glibc / GitHub
sgerrand/alpine-pkg-glibc / GitHub
SDK Tools Release Notes / Android Studio
android - Automatically accept all SDK licences / Stack Overflow