なぜIntel Macで動いていたDockerイメージがM1 Macでは動かなくなるのか、それはCPUアーキテクチャが異なるためです。
ビルド済みのイメージがM1 Mac上で動くようにする方法から書いていきます!
以下のように「–platform linux/x86_64」を指定して、あげると大抵のケースで動くようになります。
docker run --platform linux/x86_64 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=password-d mysql:latest
Docker Composeの場合は以下のように指定する。
version: '3'
services:
mysql:
image: mysql:latest
platform: linux/amd64
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- 127.0.0.1:3308:3306
次に、ビルドについて書いていきます!
これはなかなか難しいです。
Dockerファイル次第ですがエラー続出したりします。
対応方法は2つです。
根気強くエラーを潰す
EC2でビルドする
根気強くエラーを潰すについて、書いていきます。
docker buildする→エラーが出る→エラーの原因を探り対応する→docker buildする→エラーが出る…..といった形でエラーがなくなるまで根気強くエラーを潰す対応です。
なかなか大変なのと、上記対応でbuildできるDockerファイルができたとしても、次の悩みが今度は出てきます。
(大変なのでこのやり方はお勧めしません…)
次は、EC2でビルドする方法を書いていきます。こちらがオススメの方法です。
AWSのEC2(Intel CPU)を使ってビルドする方法です。
docker buildはEC2でやってdocker runだけ自分のM1 Macでやればいいという発想です。
ここにたどり着くまで苦労しましたが、これが一番ラクでオススメな方法です!
次は、デプロイについて書いていきます!
2つのデプロイ方法が考えられます。
Intel PCでビルドしてデプロイ
M1 Macでビルドしてデプロイ
デプロイ先は恐らくIntel CPUのことが多いので、Intel PCでビルドするのがお勧めです。
M1 Macでビルドしたものはデプロイに失敗することもあります。
基本的にはEC2(Intel CPU)もしくはCodebuildを使ってビルドしてからデプロイするのが良いです。
AWS ECS FargateではM1 CPUにも対応しているようです。
AWS ECS Fargateを使い、CPUをARMにしておくと、M1 Macでビルドしたイメージをそのままデプロイして動作させることができます。
(以下の記事をご参照ください。ARM=M1と置き換えて読んでいただ方がわかりやすいです)
M1 MacでDockerを使うポイントとエラーとの向き合い方についてみてきました。
チーム内でM1とIntelが共存しているとなかなか厄介そうですね。
そのうちM1とIntelを気にしなくて良くなる日が来ることを期待していますー
]]>