💡
M3チップMacでdocker-compose upを行った際にエラーが出て環境構築できない問題の解決方法
概要
新しく買ったM3 Macbook Airでdockerを使ってMySQLの環境を構築しようとした際にエラーが出てしまい、少し躓いたので備忘録として残しておきます。
内容
起動させたいコンテナ
今回は、下記yamlファイルのコンテナを起動させようとしました。
docker-compose.yaml
version: '3.3'
services:
mysql:
image: mysql:5.7
container_name: db-for-go
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --sql-mode=ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
environment:
MYSQL_ROOT_USER: ${ROOTUSER}
MYSQL_ROOT_PASSWORD: ${ROOTPASS}
MYSQL_DATABASE: ${DATABASE}
MYSQL_USER: ${USERNAME}
MYSQL_PASSWORD: ${USERPASS}
TZ: 'Asia/Tokyo'
ports:
- "3306:3306"
volumes:
- db-volume:/var/lib/mysql
volumes:
db-volume:
エラー内容
実行したコマンド
docker-compose up
上記コマンドを実行した際に下記のエラーが発生しました。
表示されたエラー
no matching manifest for linux/arm64/v8 in the manifest list entries
調べてみた感じ、どうやらデフォルトではIntelやAMDといったx86アーキテクチャ向け提供されているDockerイメージを取得しようとしているっぽい。発生したエラーは、「M3チップはarm64アーキテクチャであるため、そのイメージは使えないよ」という内容です。
解決方法
方法①
"docker-compose up"コマンドを実行する前に、事前に必要なイメージをarm64用として引っ張ってくれば解決しそうです。今回は、MySQlのイメージが必要なので
事前に実行するコマンド
docker pull --platform linux/amd64 mysql:5.7
を先に実行し、その後"docker-compose up"を行ったら解決できました。
方法②
yamlファイルに一行追記すればOKでした。
docker-compose.yaml
version: '3.3'
services:
mysql:
image: mysql:5.7
container_name: db-for-go
platform: linux/amd64 # この行を追記
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --sql-mode=ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
environment:
MYSQL_ROOT_USER: ${ROOTUSER}
MYSQL_ROOT_PASSWORD: ${ROOTPASS}
MYSQL_DATABASE: ${DATABASE}
MYSQL_USER: ${USERNAME}
MYSQL_PASSWORD: ${USERPASS}
TZ: 'Asia/Tokyo'
ports:
- "3306:3306"
volumes:
- db-volume:/var/lib/mysql
volumes:
db-volume:
この状態で"docker-compose up"を実行すると解決しました。
さいごに
今回は、yamlファイルで定義した設定でコンテナを作成しようとした際に発生したエラーの対処方法について紹介しました。
2つの方法があったが、使い分けとしては
- 方法①:IntelやAMDなどのチップを利用したPCでも同じ環境を構築したい場合
- 方法②:基本的にAppleシリコンチップのようにarm64アーキテクチャのPCのみで環境を構築する場合
といった形になると個人的に予想しています。
Discussion
手元でbuildしたイメージも、pullしたイメージも、最終的に稼働させたい環境はamd64なことがほとんどなので、私は以下の環境変数が自動セットされるようにしてます。
zshの場合は ~/.zshrc、bashの場合は~/.bashrcあたりです。
こうしておくと特に意識することなく、すべてamd64でpullも、buildも動いてくれます。
すべてRosetta2経由での実行になってしまうのでネイティブのMシリーズでの性能は出ないですが特に困ってないのできっと大丈夫。。
knziiyさん
アドバイスありがとうございます!
これはDockerでx86向けのイメージを取得してもRosetta2で変換するから、x86用のイメージしか用意されていない環境も利用できるようになる、という理解でよろしいでしょうか?
わかりにくい書き方をしてごめんなさい。
本番環境、例えばAWSのEC2やFargateでコンテナを起動する場合は結局x86にする必要があるので、ローカルのMacでも常にx86になるようにしておけばローカルでビルドしたものをそのまま動かせるし、アーキテクチャをわざわざ考慮しなくてよくなる、ということです。
そうするとRosetta2による実行になってしまうのでarmで実行するよりは遅くなりますが、私のユースケースでは別に困らないのでよしとしています。