M1 MacでDockerビルドエラー (exec format error) の解決方法
問題の概要
Apple Silicon (M1/M2) MacでDockerコンテナをビルドまたは実行しようとすると、以下のエラーが発生することがあります:
exec /usr/local/bin/docker-entrypoint.sh: exec format error
このエラーは、主にARMアーキテクチャのM1/M2 Macで、x86_64用にビルズされたDockerイメージを実行しようとした際に発生します。実行可能ファイルの形式が異なるため、システムが正しく解釈できずに「exec format error」が表示されます。
根本原因
M1/M2 MacはARM64アーキテクチャを採用していますが、多くのDockerイメージは従来のx86_64(AMD64)アーキテクチャ向けにビルドされています。このアーキテクチャの不一致がエラーの原因です。
注意
特にNode.jsのようなランタイム環境を含むイメージでは、ネイティブモジュールの互換性問題も発生しやすいため、適切なプラットフォーム指定が重要です。
解決方法
方法1: Dockerfileでのプラットフォーム指定(推奨)
DockerfileのFROM
命令にプラットフォームを明示的に指定します:
FROM --platform=linux/amd64 node:11.15
この方法により、Dockerはx86_64アーキテクチャ用のイメージをプルし、ビルドプロセス全体を適切なプラットフォームで実行します。
方法2: ビルド時のプラットフォーム指定
docker buildコマンド実行時にプラットフォームを指定する方法もあります:
docker build --platform=linux/amd64 -t your-image-name:tag .
方法3: マルチプラットフォームイメージの使用
最新のNode.jsイメージを使用し、マルチプラットフォーム対応のバージョンを指定します:
FROM node:20
Node.js 20以降の公式イメージはマルチアーキテクチャに対応しており、自動的に適切なプラットフォームが選択されます。
完全な修正例
元のDockerfileをM1 Mac対応にするには、以下のように修正します:
# nodejs - プラットフォームを明示的に指定
FROM --platform=linux/amd64 node:11.15
ENV NODE_VERSION 11.15
# 以降は元の設定を維持...
WORKDIR ./
# mongodb toolsのインストール
RUN wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add -
RUN echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/5.0 main" | tee /etc/apt/sources.list.d/mongodb-org-5.0.list
RUN apt-get update
RUN apt-get install -y mongodb
# その他の設定...
ベストプラクティス
- 可能な限り最新のマルチアーキテクチャ対応イメージを使用しましょう
- 開発環境と本番環境で同じアーキテクチャを使用することが理想的です
docker buildx
を使用してマルチプラットフォームビルドを行うことも検討してください
補足情報
アーキテクチャの確認方法
現在のDockerイメージのアーキテクチャを確認するには:
docker inspect image-name | grep Architecture
パフォーマンスに関する注意
x86_64イメージをM1 Macで実行する場合、Rosetta 2によるエミュレーションが行われるため、ネイティブのARM64イメージに比べてパフォーマンスが低下する可能性があります。可能であれば、ARM64ネイティブのイメージを使用することをおすすめします。
まとめ
M1/M2 Macでの「exec format error」は、Dockerイメージのアーキテクチャ不一致が原因です。--platform=linux/amd64
を指定することで簡単に解決できますが、長期的にはマルチアーキテクチャ対応のイメージへの移行を検討しましょう。
これでM1/M2 Mac環境でもDockerコンテナのビルドと実行が問題なく行えるようになります。