Skip to content

macOSでのDockerデフォルトプラットフォームをlinux/amd64に設定する方法

問題概要

Apple Silicon(M1/M2チップ)搭載のmacOSでDockerを使用する場合、デフォルトではARM64アーキテクチャ用のイメージがビルドおよび実行されます。しかし、本番環境がAMD64(x86_64)アーキテクチャの場合、プラットフォームの不一致により互換性問題が発生することがあります。

この問題を解決するには、Dockerコマンド実行時に毎回 --platform=linux/amd64 フラグを指定する必要がありますが、これは面倒で見落としの原因となります。

解決策

環境変数によるグローバル設定(推奨)

最も簡単で効果的な方法は、環境変数 DOCKER_DEFAULT_PLATFORM を設定することです:

bash
export DOCKER_DEFAULT_PLATFORM=linux/amd64

この設定を永続化するには、シェルの設定ファイルに追加します:

Zshを使用する場合(~/.zshrc):

bash
echo 'export DOCKER_DEFAULT_PLATFORM=linux/amd64' >> ~/.zshrc

Bashを使用する場合(~/.bash_profileまたは~/.bashrc):

bash
echo 'export DOCKER_DEFAULT_PLATFORM=linux/amd64' >> ~/.bash_profile

設定後、ターミナルを再起動するか、以下のコマンドで設定を反映させます:

bash
source ~/.zshrc  # または source ~/.bash_profile

TIP

この方法はすべてのDockerコマンド(run、build、pullなど)に適用され、一度設定するだけで全ての操作でAMD64プラットフォームが使用されます。

Docker Composeでの設定

docker-compose.ymlファイル内でサービスごとにプラットフォームを指定できます:

yaml
services:
  frontend:
    platform: linux/amd64
    build: frontend
    ports:
      - 80:80
  
  backend:
    platform: linux/amd64
    build: backend

個別コマンドでの一時的な設定

特定のコマンドでのみAMD64プラットフォームを使用したい場合:

bash
# 単一コマンドでの環境変数設定
DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose build

# buildxを使用した明示的なプラットフォーム指定
docker buildx build --platform linux/amd64 .

# 個別のdocker runコマンド
docker run --platform linux/amd64 your_image

Dockerfile内での設定

Dockerfile内でベースイメージの取得時にプラットフォームを指定することもできます:

dockerfile
FROM --platform=linux/amd64 python:3.7-alpine
# 以降の処理...

注意点

既に異なるプラットフォームのイメージがダウンロードされている場合、Dockerはデフォルトでキャッシュされたイメージを使用します。新しいプラットフォームでビルドするには、既存のイメージを削除してください:

bash
docker image rm your_image_name

カスタムシェル関数による解決

環境変数の設定が難しい場合、シェル関数でDockerコマンドをラップする方法もあります:

bash
docker() {
  if [[ `uname -m` == "arm64" ]] && [[ "$1" == "run" || "$1" == "build" ]]; then
     /usr/local/bin/docker "$1" --platform linux/amd64 "${@:2}"
  else
     /usr/local/bin/docker "$@"
  fi
}

この関数をシェル設定ファイル(~/.zshrcまたは~/.bashrc)に追加すると、runbuildコマンド実行時に自動的にプラットフォームフラグが追加されます。

まとめ

Apple Silicon macOSでDockerを使用する際のプラットフォーム問題は、以下のいずれかの方法で解決できます:

  1. 環境変数設定(推奨):export DOCKER_DEFAULT_PLATFORM=linux/amd64
  2. Docker Compose設定:サービスごとにplatform: linux/amd64を指定
  3. 個別コマンド指定:必要に応じて--platformフラグを使用
  4. Dockerfile指定:FROM命令でプラットフォームを明示

環境変数を使用したグローバル設定が最も簡単で効果的であり、全てのDocker操作に一貫して適用されます。