「Intel Macで動いていたDockerイメージがM1 Macにパソコンで動かない…」そんな方向けの記事です。
なぜIntel Macで動いていたDockerイメージがM1 Macでは動かなくなるのか、それはCPUアーキテクチャが異なるためです。
ビルド済みのイメージがM1 Mac上で動くようにする方法から書いていきます!
とりあえず動くようにする(docker runできるようにする)対策
以下のように「–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 buildできるようにする)対策
これはなかなか難しいです。
Dockerファイル次第ですがエラー続出したりします。
対応方法は2つです。
根気強くエラーを潰す
EC2でビルドする
根気強くエラーを潰すについて、書いていきます。
根気強くエラーを潰す
docker buildする→エラーが出る→エラーの原因を探り対応する→docker buildする→エラーが出る…..といった形でエラーがなくなるまで根気強くエラーを潰す対応です。
なかなか大変なのと、上記対応でbuildできるDockerファイルができたとしても、次の悩みが今度は出てきます。
- intel PCで動くのか(チーム内にintel PCの人がいる場合)
- 動作保証するために、影響範囲・テストなど実施する必要がある
(大変なのでこのやり方はお勧めしません…)
次は、EC2でビルドする方法を書いていきます。こちらがオススメの方法です。
EC2でビルドする
AWSのEC2(Intel CPU)を使ってビルドする方法です。
docker buildはEC2でやってdocker runだけ自分のM1 Macでやればいいという発想です。
ここにたどり着くまで苦労しましたが、これが一番ラクでオススメな方法です!
次は、デプロイについて書いていきます!
デプロイする
2つのデプロイ方法が考えられます。
Intel PCでビルドしてデプロイ
M1 Macでビルドしてデプロイ
Intel PCでビルドしてデプロイ(オススメ)
デプロイ先は恐らくIntel CPUのことが多いので、Intel PCでビルドするのがお勧めです。
M1 Macでビルドしたものはデプロイに失敗することもあります。
基本的にはEC2(Intel CPU)もしくはCodebuildを使ってビルドしてからデプロイするのが良いです。
M1 Macでビルドしてデプロイ
AWS ECS FargateではM1 CPUにも対応しているようです。
AWS ECS Fargateを使い、CPUをARMにしておくと、M1 Macでビルドしたイメージをそのままデプロイして動作させることができます。
(以下の記事をご参照ください。ARM=M1と置き換えて読んでいただ方がわかりやすいです)
まとめ
M1 MacでDockerを使うポイントとエラーとの向き合い方についてみてきました。
チーム内でM1とIntelが共存しているとなかなか厄介そうですね。
そのうちM1とIntelを気にしなくて良くなる日が来ることを期待していますー