macOSでのDockerデフォルトプラットフォームをlinux/amd64に設定する方法
問題概要
Apple Silicon(M1/M2チップ)搭載のmacOSでDockerを使用する場合、デフォルトではARM64アーキテクチャ用のイメージがビルドおよび実行されます。しかし、本番環境がAMD64(x86_64)アーキテクチャの場合、プラットフォームの不一致により互換性問題が発生することがあります。
この問題を解決するには、Dockerコマンド実行時に毎回 --platform=linux/amd64
フラグを指定する必要がありますが、これは面倒で見落としの原因となります。
解決策
環境変数によるグローバル設定(推奨)
最も簡単で効果的な方法は、環境変数 DOCKER_DEFAULT_PLATFORM
を設定することです:
export DOCKER_DEFAULT_PLATFORM=linux/amd64
この設定を永続化するには、シェルの設定ファイルに追加します:
Zshを使用する場合(~/.zshrc):
echo 'export DOCKER_DEFAULT_PLATFORM=linux/amd64' >> ~/.zshrc
Bashを使用する場合(~/.bash_profileまたは~/.bashrc):
echo 'export DOCKER_DEFAULT_PLATFORM=linux/amd64' >> ~/.bash_profile
設定後、ターミナルを再起動するか、以下のコマンドで設定を反映させます:
source ~/.zshrc # または source ~/.bash_profile
TIP
この方法はすべてのDockerコマンド(run、build、pullなど)に適用され、一度設定するだけで全ての操作でAMD64プラットフォームが使用されます。
Docker Composeでの設定
docker-compose.yml
ファイル内でサービスごとにプラットフォームを指定できます:
services:
frontend:
platform: linux/amd64
build: frontend
ports:
- 80:80
backend:
platform: linux/amd64
build: backend
個別コマンドでの一時的な設定
特定のコマンドでのみAMD64プラットフォームを使用したい場合:
# 単一コマンドでの環境変数設定
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内でベースイメージの取得時にプラットフォームを指定することもできます:
FROM --platform=linux/amd64 python:3.7-alpine
# 以降の処理...
注意点
既に異なるプラットフォームのイメージがダウンロードされている場合、Dockerはデフォルトでキャッシュされたイメージを使用します。新しいプラットフォームでビルドするには、既存のイメージを削除してください:
docker image rm your_image_name
カスタムシェル関数による解決
環境変数の設定が難しい場合、シェル関数でDockerコマンドをラップする方法もあります:
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)に追加すると、run
とbuild
コマンド実行時に自動的にプラットフォームフラグが追加されます。
まとめ
Apple Silicon macOSでDockerを使用する際のプラットフォーム問題は、以下のいずれかの方法で解決できます:
- 環境変数設定(推奨):
export DOCKER_DEFAULT_PLATFORM=linux/amd64
- Docker Compose設定:サービスごとに
platform: linux/amd64
を指定 - 個別コマンド指定:必要に応じて
--platform
フラグを使用 - Dockerfile指定:FROM命令でプラットフォームを明示
環境変数を使用したグローバル設定が最も簡単で効果的であり、全てのDocker操作に一貫して適用されます。