Skip to content

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命令にプラットフォームを明示的に指定します:

dockerfile
FROM --platform=linux/amd64 node:11.15

この方法により、Dockerはx86_64アーキテクチャ用のイメージをプルし、ビルドプロセス全体を適切なプラットフォームで実行します。

方法2: ビルド時のプラットフォーム指定

docker buildコマンド実行時にプラットフォームを指定する方法もあります:

bash
docker build --platform=linux/amd64 -t your-image-name:tag .

方法3: マルチプラットフォームイメージの使用

最新のNode.jsイメージを使用し、マルチプラットフォーム対応のバージョンを指定します:

dockerfile
FROM node:20

Node.js 20以降の公式イメージはマルチアーキテクチャに対応しており、自動的に適切なプラットフォームが選択されます。

完全な修正例

元のDockerfileをM1 Mac対応にするには、以下のように修正します:

dockerfile
# 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イメージのアーキテクチャを確認するには:

bash
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コンテナのビルドと実行が問題なく行えるようになります。