現在、制作中のRailsアプリのHerokuデプロイに大苦戦しました。
何度もエラーに遭遇したのですが、その中の1つを記録として残しておきます。
環境
- M1 Mac
- Rails6
- MySQL バージョン5
- Docker
前提
本番環境DBはHeroku無料枠のMySQLを使用します。
HerokuでMySQLを使用する場合は無料枠でもクレジットカード登録が必要です。
詳しくはこちら(Heroku公式)
Herokuデプロイに必要なファイル追加、DB追加、環境変数設定などは
こちらの記事を参考にさせて頂きました。
Herokuデプロイ
まず通常通りにコマンドを打っていきます。
dockerを使用しているのでContainer Registryにログインし、
imagesをpushする必要があります。
imagesをpushするのは結構時間がかかるので気長に待ちます。
今回、app名は、my-rails-appとします。
$ heroku container:login
$ heroku container:push web -a my-rails-app
$ heroku container:release web - a my-rails-app
$ heroku run rails db:migrate -a my-rails-app
M1に起こるエラー
マイグレートをすると下記のようなエラーが出てきます。
Error: Exec format error
下記のコマンドで原因を探ってみます。
$ docker inspect registry.heroku.com/my-rails-app/web
[
....
"Architecture": "arm64",
"Os": "linux",
....
]
色々と書いているかと思うのですが、下の方に
アーキテクチャがarm64と書いてあり、こちらがエラーの原因となっているようです。
dockerのimagesをプラットフォームと合わせる必要があるみたいです。
解決方法はいくつかあるようですが、今回はDocker BuildxというDockerのプラグインを使用し、
プラットフォームを指定します。(このあたりよく理解できていないです....)
エラー対処コマンド
docker buildx build --platform linux/amd64 -t my-rails-app .
docker tag my-rails-app registry.heroku.com/my-rails-app/web
docker push registry.heroku.com/my-rails-app/web
heroku container:release web -a my-rails-app
heroku open -a my-rails-app
上記コマンドで無事にherokuにデプロイできました!
理解が追いついてないので、もう少し深掘りし随時更新していきます(@_@;)