脳科学(fMRI)のレガシー資産「SPM12」をDockerに閉じ込めてMチップ Macで強制起動する
はじめに
脳機能画像(fMRI)解析のデファクトスタンダードである SPM12 (Statistical Parametric Mapping)。
世界中の研究室で使われていますが、これをモダンな開発環境(MacBook Air M1/M2/M3 など)やクラウドネイティブな文脈で扱おうとすると、2 つの巨大な壁にぶち当たります。
- MATLAB ライセンスの壁: 有償の MATLAB 本体が必要で、ライセンス管理が煩雑。CI/CD で回すなんてもってのほか。
- CPU の壁: SPM の配布バイナリは基本的に Intel (x86_64) 向け。Apple Silicon (ARM64) ではそのまま動きません。
「研究室の古い PC じゃないと解析できない」なんてナンセンスです。
今回は、Docker のプラットフォームエミュレーション機能 と MATLAB Runtime (MCR) を駆使して、「M チップ Mac 上で、MATLAB 本体なしで動く、完全再現可能な SPM12 コンテナ」 を構築した話です。
0. 成果物
作成した Dockerfile
達成したこと:
- No MATLAB: 無料の MCR (MATLAB Compiler Runtime) を使用し、MATLAB ライセンス不要化。
-
Anywhere:
docker build一発で、URL からインストーラーを全自動取得して環境構築(完全な IaC)。 - On Mac: Docker の Rosetta 2 エミュレーションで、ARM 機上で x86 バイナリを強制駆動。
1. 戦略とアーキテクチャ
今回のアプローチは以下の通りです。
- Software: SPM12 Standalone 版を使用。これはコンパイル済みバイナリなので MATLAB 本体は不要ですが、特定のバージョンの MCR が必要です。
- Infrastructure: Docker Desktop for Mac。
-
The Hack:
linux/amd64指定によるエミュレーション。
依存関係の解消
SPM12 (r7771) は MCR R2019b (v97) に依存しています。これ以外のバージョンでは動きません。この厳密なバージョン固定を Dockerfile 内でコード化します。
2. Dockerfile の実装
手動で ZIP をダウンロードして COPY するのは「再現性」が低いので採用しません。
wget で UCL(ロンドン大学)と MathWorks のサーバーから直接アーティファクトを引き抜き、全自動でビルドする Dockerfile を設計しました。
# --- 1. アーキテクチャの強制指定 (The Hack) ---
# Mチップ Mac (ARM) でも Intel (amd64) として振る舞わせるフラグ
FROM --platform=linux/amd64 ubuntu:20.04
# 対話モード防止 & 必要な依存ライブラリ
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
wget \
unzip \
libxext6 \
libxt6 \
libxmu6 \
libxpm4 \
libxtst6 \
bc \
ca-certificates \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# --- バージョン定義 (ここが重要) ---
# SPM12 r7771 は MCR R2019b (v97) が必須
ENV MCR_VERSION=v97
ENV MCR_RELEASE=R2019b
ENV MCR_UPDATE=9
ENV SPM_VERSION=r7771
# --- 2. MCR (MATLAB Runtime) の全自動インストール ---
WORKDIR /opt/mcr_install
RUN wget -q [https://ssd.mathworks.com/supportfiles/downloads/$](https://ssd.mathworks.com/supportfiles/downloads/$){MCR_RELEASE}/Release/${MCR_UPDATE}/deployment_files/installer/complete/glnxa64/MATLAB_Runtime_${MCR_RELEASE}_Update_${MCR_UPDATE}_glnxa64.zip -O mcr.zip && \
unzip -q mcr.zip && \
./install -mode silent -agreeToLicense yes && \
cd / && \
rm -rf /opt/mcr_install
# --- 3. SPM12 Standalone の全自動インストール ---
WORKDIR /opt
RUN wget -q [https://www.fil.ion.ucl.ac.uk/spm/download/restricted/utopia/dev/spm12_$](https://www.fil.ion.ucl.ac.uk/spm/download/restricted/utopia/dev/spm12_$){SPM_VERSION}_Linux_${MCR_RELEASE}.zip -O spm12.zip && \
unzip -q spm12.zip && \
rm spm12.zip
# --- 4. パス設定 ---
# Linux共有ライブラリへのパスを通す
ENV LD_LIBRARY_PATH=/usr/local/MATLAB/MATLAB_Runtime/${MCR_VERSION}/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/${MCR_VERSION}/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/${MCR_VERSION}/sys/os/glnxa64
ENV PATH=/opt/spm12:${PATH}
WORKDIR /data
ENTRYPOINT ["/opt/spm12/spm12"]
CMD ["--help"]
3. 技術的な解説とハマりポイント
① --platform=linux/amd64 の魔法
M1 Mac で普通にビルドすると、Docker は linux/arm64 の Ubuntu イメージを取得します。しかし、MathWorks が配布している MCR のインストーラーは x86_64 用です。 これを実行しようとすると exec format error や install_unix: not found といったエラーで落ちます。
FROM --platform=linux/amd64 を指定することで、Docker Desktop の Rosetta 2 エミュレーションが働き、ARM チップ上でも Intel 用のバイナリを透過的に実行できるようになります。ビルド時間は多少伸びますが(私の環境で約 18 分)、互換性には代えられません。
② Standalone 版のバージョン整合性
SPM Standalone 版は、コンパイルされた時点の MATLAB バージョンと完全に一致する MCR を要求します。「最新の MCR 入れておけばいいでしょ」は通用しません。 今回は SPM12 r7771 だったので R2019b を指定しています。この組み合わせを見つけるのが一番の苦労ポイントかもしれません。
4. 実行結果
ビルドしたイメージを実行してみます。
docker build -t my-spm12-auto .
docker run --rm my-spm12-auto eval "disp('Hello fMRI World from Docker')"
出力:
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) ...
SPM12, version 7771 (standalone)
MATLAB, version 9.7.0.1737446 (R2019b) Update 9
___ ____ __ __
/ __)( _ \( \/ )
\__ \ )___/ ) ( Statistical Parametric Mapping
(___/(__) (_/\/\_) SPM12 - [https://www.fil.ion.ucl.ac.uk/spm/](https://www.fil.ion.ucl.ac.uk/spm/)
Hello fMRI World from Docker
見慣れた SPM のアスキーアートと、MATLAB エンジンからの Hello fMRI World。 Apple Silicon の Mac 上で、Intel Linux 用のレガシーな解析エンジンが完璧に動作しています。
まとめ
ただ「動いた」だけではありません。これは以下のような価値があります。
Reproducibility (再現性): Dockerfile という「コード」で環境が定義されたため、誰がいつビルドしても全く同じ解析環境が手に入ります。科学実験においてこれは極めて重要です。
Portability (可搬性): このコンテナは M チップ Mac だけでなく、Windows でも、AWS 上の Linux サーバーでも同じように動きます。
Cost Efficiency: MATLAB ライセンスを消費しません。
参考文献
⚠️ Disclaimer & License
License: This project provides a recipe (Dockerfile) to build the environment. The software installed within the image (SPM12 and MATLAB Runtime) is subject to their respective licenses.
SPM12: Distributed under the GNU GPL v2 (https://www.fil.ion.ucl.ac.uk/spm/software/spm12/).
MATLAB Runtime (MCR): Please refer to the MathWorks License Agreement (https://jp.mathworks.com/products/compiler/matlab-runtime.html).
Distribution: Do not push the built Docker image to public registries (e.g., Docker Hub) without verifying the redistribution rights of the included software. The author recommends building the image locally.
🔗 References
SPM12 Standalone Installation Guide (https://www.fil.ion.ucl.ac.uk/spm/docs/installation/standalone/)
Discussion