3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flutterアプリ開発の自動化(ビルド@コンテナ、エミュレータ@ホスト) 2. コンテナの準備

Last updated at Posted at 2025-07-03

下記の記事の続きです。

Flutterアプリ開発の自動化(ビルド@コンテナ、エミュレータ@ホスト) 1. ホスト準備


環境

  • macOS Sequoia ver. 15.4.1
  • Docker(別環境でPodmanでも確認済み)

スクリーンショット 2025-06-21 1.14.22.png

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_ROOTANDROID_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 doctorflutter build などのコマンドがどこからでも使えるようになる。

exec gosu flutter "$@"

gosu コマンドで flutter ユーザーとして引数付きコマンドを実行。

  • exec により、このスクリプトは新しいプロセスで上書きされ、DockerのPID 1問題(Zombieプロセス)を防ぐ。
  • $@ はコンテナ起動時に渡された任意の引数(例: flutter doctor)をそのまま引き継ぐ。
  • root ではなく flutter ユーザーでコマンドが実行されるため、権限的にも安全。

2.3. コンテナをビルド

docker build -t flutter-dev .

続きはこちら


参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?