Docker Desktop for Mac で「no matching manifest for linux/arm64」エラーを解決する

M1 / M2 Mac(Apple Silicon)環境で Docker イメージを docker pull した際、次のようなエラーに遭遇することがあります。

no matching manifest for linux/arm64/v8 in the manifest list entries

これは、対象の Docker イメージが arm64 アーキテクチャ(Apple Silicon)向けにビルドされていない ことを意味します。

この記事では、このエラーの仕組みと原因、そして --platform オプションやマルチアーキテクチャ対応による解決策を解説します。

エラーの原因

Docker Desktop for Mac(Apple Silicon 版)はデフォルトで arm64 (linux/arm64/v8) のプラットフォームとして動作します。
そのため、Docker Hub 上に「arm64 向けの manifest(マニフェスト情報)」が存在しないイメージを pull しようとすると、このエラーが出ます。

docker pull someimage:latest
# => no matching manifest for linux/arm64/v8

たとえば、古いバージョンの Node.js や MySQL、Elasticsearch などの公式イメージには、amd64 向けのみ存在するものがあります。

代表的な発生パターン

1. x86 専用のイメージを pull している

Docker Hub のイメージが linux/amd64 のみでビルドされている場合、Apple Silicon(arm64)では直接実行できません。

例:

docker pull some-legacy-image:1.0

2. buildx / manifest 設定がないカスタムイメージ

自作の Dockerfile でビルドした際、docker build のデフォルト設定が amd64 のみになっている場合があります。
この場合、M1/M2 Mac で pull すると同じく「no matching manifest」エラーが発生します。

対処法

対処法1: --platform オプションでアーキテクチャを指定する

手っ取り早い解決策は、--platform フラグで amd64 を明示的に指定してイメージを pull することです。

docker pull --platform linux/amd64 someimage:latest

この方法では、Rosetta 2 を利用して x86 イメージをエミュレーション実行します。
パフォーマンスは若干低下しますが、開発環境では多くの場合これで十分です。

また、docker run 時にも指定可能です。

docker run --platform linux/amd64 someimage

対処法2: Dockerfile からビルドする際に --platform を指定する

自分でビルドする場合も同様に、docker build にプラットフォームを指定できます。

docker buildx build --platform linux/arm64 -t myimage:latest .

これにより、arm64 向けのバイナリを生成できます。

複数プラットフォームを一度にビルドすることも可能です。

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t myimage:multiarch \
  --push .

このようにすると、Docker Hub などにマルチアーキテクチャのマニフェストが登録され、どの環境でも自動的に適切なイメージが取得されます。

対処法3: Docker Hub で対応アーキテクチャを確認する

Docker Hub の各イメージページでは、対応しているアーキテクチャが明記されています。
たとえば、Node.js の公式イメージでは以下のように記載されています。

OS/ARCH
linux/amd64
linux/arm64/v8

arm64 がない場合は、代替のタグを探すか、--platform linux/amd64 を付けるしかありません。

対処法4: docker-compose.yml に platform を記述する

Compose 環境でも、各サービスごとにプラットフォームを指定できます。

services:
  app:
    image: someimage:latest
    platform: linux/amd64

これにより、Apple Silicon でも自動的にエミュレーションで実行されます。

対処法5: buildx を使ってマルチアーキテクチャ対応イメージを作る

本番環境で両方のアーキテクチャをサポートしたい場合は、docker buildx を使ってマルチアーキテクチャ対応のイメージをビルドします。

docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t myorg/app:latest --push .

これにより、Docker Hub で自動的にプラットフォームを判別して適切なイメージが配信されるようになります。

まとめ

「no matching manifest for linux/arm64」エラーは、Docker イメージが M1/M2 Mac(arm64)に対応していないことが原因です。
主な解決策は以下の通りです。

  • 一時対応:--platform linux/amd64 を付けて実行する
  • 永続対応:docker buildx を使ってマルチアーキテクチャ対応にする
  • Docker Hub で対応アーキテクチャを確認してから利用する

開発段階ではエミュレーション実行で十分ですが、本番運用では buildx を用いたマルチプラットフォーム対応が推奨されます。

参考

タイトルとURLをコピーしました