下記の記事の続きです。
Flutterアプリ開発の自動化(ビルド@コンテナ、エミュレータ@ホスト) 1. ホスト準備
環境
- macOS Sequoia ver. 15.4.1
- Docker(別環境でPodmanでも確認済み)
2. コンテナの準備
2.1. Dockerfileを用意
FROM ubuntu:22.04
ARG FLUTTER_VERSION=stable
ENV DEBIAN_FRONTEND=noninteractive
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV ANDROID_HOME=/opt/android-sdk
ENV PATH=/home/flutter/flutter/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$PATH
# --- 必須パッケージのインストール ---
RUN apt-get update && apt-get install -y \
curl git unzip xz-utils zip libglu1-mesa openjdk-17-jdk sudo gosu \
&& rm -rf /var/lib/apt/lists/*
# --- Android SDK Command-line Tools インストール ---
RUN mkdir -p $ANDROID_SDK_ROOT/cmdline-tools && \
curl -o /tmp/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip && \
unzip /tmp/cmdline-tools.zip -d $ANDROID_SDK_ROOT/cmdline-tools && \
mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/latest && \
rm /tmp/cmdline-tools.zip
# --- Android SDK コンポーネントインストール ---
RUN yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --sdk_root=$ANDROID_SDK_ROOT \
"platform-tools" \
"platforms;android-33" \
"build-tools;33.0.0" \
"emulator" \
"system-images;android-33;google_apis;x86_64"
# --- flutterユーザーの作成と権限付与 ---
RUN useradd -m flutter && echo "flutter ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
chown -R flutter:flutter $ANDROID_SDK_ROOT
# --- Flutter SDK インストール ---
USER flutter
WORKDIR /home/flutter
ARG FLUTTER_VERSION
RUN git clone -b ${FLUTTER_VERSION} --depth 1 https://github.com/flutter/flutter.git /home/flutter/flutter && \
cd /home/flutter/flutter && \
git fetch --depth=2 origin $(git rev-parse HEAD)
ENV PATH=/home/flutter/flutter/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$PATH
# --- Flutter 初期セットアップ ---
RUN flutter precache
RUN git config --global --add safe.directory /home/flutter/flutter
# --- entrypoint.sh のコピー ---
USER root
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
# --- デフォルト作業ディレクトリとエントリポイント設定 ---
WORKDIR /project
ENTRYPOINT ["/entrypoint.sh"]
各パートの詳細
🐧 ベースイメージと環境変数の設定
FROM ubuntu:22.04
ARG FLUTTER_VERSION=stable
ENV DEBIAN_FRONTEND=noninteractive
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV ANDROID_HOME=/opt/android-sdk
ENV PATH=/home/flutter/flutter/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$PATH
-
ubuntu:22.04(LTS (Long Term Support) バージョンの安定したLinux環境)をベースに利用。 -
DEBIAN_FRONTEND=noninteractiveにより、APTコマンドで対話を抑制。 - Android SDKのパスを明示的に指定するため、
ANDROID_SDK_ROOTとANDROID_HOMEを/opt/android-sdkに設定。 -
PATHにFlutterとAndroid関連ツールを追加して、どこからでも実行できるように準備。
📦 必須パッケージのインストール
RUN apt-get update && apt-get install -y \
curl git unzip xz-utils zip libglu1-mesa openjdk-17-jdk sudo gosu \
&& rm -rf /var/lib/apt/lists/*
- FlutterとAndroid SDKを動かすのに必要なツールをインストール:
-
curl,git,unzip,zip: 基本的なダウンロードや解凍、Git操作。 -
xz-utils:.tar.xz圧縮ファイルの解凍に必要。 -
libglu1-mesa: 一部のFlutterビルドプロセスで必要なOpenGLライブラリ。 -
openjdk-17-jdk: AndroidビルドにはJava(17以上)が必須。 -
sudo,gosu: 権限切り替えに必要。
-
📥 Android Command-line Tools のインストール
RUN mkdir -p $ANDROID_SDK_ROOT/cmdline-tools && \
curl -o /tmp/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip && \
unzip /tmp/cmdline-tools.zip -d $ANDROID_SDK_ROOT/cmdline-tools && \
mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/latest && \
rm /tmp/cmdline-tools.zip
- Android SDK の Command-line Tools(CLI版ツール)をダウンロードして設置。
- 解凍後、公式のパス構造に合わせて
latestディレクトリに移動。
📦 Android SDK コンポーネントのインストール
RUN yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --sdk_root=$ANDROID_SDK_ROOT \
"platform-tools" \
"platforms;android-33" \
"build-tools;33.0.0" \
"emulator" \
"system-images;android-33;google_apis;x86_64"
-
sdkmanagerを使用して必要なSDKコンポーネントをインストール。-
platform-tools: adbなど。 -
platforms;android-33: Android API 33対応。 -
build-tools;33.0.0: ビルドに必要。 -
emulator: Android Emulator実行に必要。 -
system-images: x86_64 エミュレータ用のGoogle APIイメージ。
-
👤 flutterユーザーの作成とパーミッション設定
RUN useradd -m flutter && echo "flutter ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
chown -R flutter:flutter $ANDROID_SDK_ROOT
- セキュリティと柔軟性のため、rootではなく
flutterユーザーを作成。 -
sudo可能にし、SDKの所有者もこのユーザーに変更。
🐦 Flutter SDK のインストール
USER flutter
WORKDIR /home/flutter
ARG FLUTTER_VERSION
RUN git clone -b ${FLUTTER_VERSION} --depth 1 https://github.com/flutter/flutter.git /home/flutter/flutter && \
cd /home/flutter/flutter && \
git fetch --depth=2 origin $(git rev-parse HEAD)
- Flutter SDK を GitHub から clone。
- 任意のバージョン(デフォルトは
stable)を利用可能。 -
--depth 1で最小限の履歴を取得して軽量化。
🚀 Flutter 初期セットアップ
RUN flutter precache
RUN git config --global --add safe.directory /home/flutter/flutter
-
flutter precache: 初回ビルドで必要なバイナリ(エンジン、Web SDKなど)をあらかじめダウンロード。 -
safe.directoryは、Docker内でGitのセキュリティ制限を回避するために必要です(Flutterの中でGitが使われるため)。
🔄 entrypoint.shのコピーと権限設定
USER root
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
- 任意の初期処理スクリプト
entrypoint.shをコンテナに追加。 - 実行可能権限を付与。
📁 作業ディレクトリとエントリーポイントの設定
WORKDIR /project
ENTRYPOINT ["/entrypoint.sh"]
- デフォルトの作業ディレクトリを
/projectに設定。 -
docker run時に/entrypoint.shが自動で実行されるように設定。
2.2. entrypoint.shを用意
#!/bin/bash
set -e
export ANDROID_SDK_ROOT=/opt/android-sdk
export ANDROID_HOME=/opt/android-sdk
export PATH=/home/flutter/flutter/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$PATH
exec gosu flutter "$@"
entrypoint.sh の各行説明(Flutter開発用)
各パートの詳細
#!/bin/bash
実行シェルを Bash に指定。シバン(shebang)によりこのスクリプトは Bash で実行される。
set -e
どれか1つでもコマンドが失敗したら即終了するようにする。エラーが起きても処理が進まないようにするための安全策。
export ANDROID_SDK_ROOT=/opt/android-sdk
export ANDROID_HOME=/opt/android-sdk
export PATH=/home/flutter/flutter/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$PATH
FlutterとAndroid SDKに関する環境変数をセット。
-
ANDROID_SDK_ROOT/ANDROID_HOMEは ホストAndroid SDK のルートディレクトリ。 -
PATHに Flutter CLI、SDKマネージャー(sdkmanager)、ADB などを追加。 - これにより、
flutter doctorやflutter buildなどのコマンドがどこからでも使えるようになる。
exec gosu flutter "$@"
gosu コマンドで flutter ユーザーとして引数付きコマンドを実行。
-
execにより、このスクリプトは新しいプロセスで上書きされ、DockerのPID 1問題(Zombieプロセス)を防ぐ。 -
$@はコンテナ起動時に渡された任意の引数(例:flutter doctor)をそのまま引き継ぐ。 - root ではなく flutter ユーザーでコマンドが実行されるため、権限的にも安全。
2.3. コンテナをビルド
docker build -t flutter-dev .
続きはこちら
参考
- Flutter公式: https://flutter.dev/
- Android SDK: https://developer.android.com/studio
- GitHub Flutterリポジトリ: https://github.com/flutter/flutter
- Android SDK Command-line Tools の環境変数
- Flutter SDK installation guide
- Command line tools only
- Flutter GitHub repository
- flutter precache
- Bash シェル: https://www.gnu.org/software/bash/manual/bash.html
- gosu: https://github.com/tianon/gosu
- Flutter CLI: https://docs.flutter.dev/reference/flutter-cli
- Android SDK Command-line Tools: https://developer.android.com/studio/command-line
- Docker ENTRYPOINT と CMD の違い: https://docs.docker.com/engine/reference/builder/#entrypoint
