そろそろnoteの開発機をM1Mac対応にした軌跡を残しておく
アフターアドベント2日目
M1 Macにnote開発環境を構築する事になった
入社日、IntelMacを支給されて、新しいチームで開発をするぞー!と思っていたのもつかの間、入社オンボーディングで目の前に準備されたMacを見るとM1であった。新しいMacを使える喜びとともに、はたしてこのMacに環境構築して動くのだろうか?と不安になった。
メンバーに聞くとnote開発環境がM1 Mac上で動かないという話から
突然環境を作らないとやっていけない状況に置かれた話。
環境確認
noteは大きく分けるとサーバサイドとフロントエンドサイトの二つのプロジェクトを同時に起動して開発する必要があった。
フロントエンド
フロントエンドの部分はnode v16のインストールによって、M1 Mac上でネイティブに起動させる事が出来た。
サーバサイド
サーバサイドはDockerで環境を立ち上げる方法があったのでDockerを準備し、
まずは状況を確認するために環境をそのまま起動してみると、落ちる。
なにが落ちるかってRedisが落ちるんですね。
[g@M1Max note (develop)]$ dc up db redis app
[+] Running 0/2
⠙ db Pulling 5.1s
⠿ redis Error 5.1s
no matching manifest for linux/arm64/v8 in the manifest list entries
Redisを単体で立ち上げてみる
[g@M1Max note (develop)]$ dc up redis
[+] Running 7/7
⠿ redis Pulled 20.7s
〜〜〜〜
[+] Running 2/2
⠿ Volume "xxxx_bundle-install" Created 0.0s
⠿ Container xxxx_redis_1 Created 0.1s
Attaching to redis_1
〜〜〜
redis_1 | 1:M 10 Jan 2022 08:28:47.790 # Server initialized
redis_1 | 1:M 10 Jan 2022 08:28:47.791 * Ready to accept connections
OKそう
タイミング的に何かが引っかかって落ちたんだろうと思う。
MySQLを単体で上げてみる
次に、MySQLを単体起動
[g@M1Max note (develop)]$ dc up db
[+] Running 0/1
⠹ db Pulling 5.1s
no matching manifest for linux/arm64/v8 in the manifest list entries
MySQLがダメそう
当時使用していたMySQLのバージョンだとlinux/arm64に対応したDockerイメージがないとの事で、公式にも書いてありました。
mariadbはarm64のイメージもあるので、バージョンが若干ずれるが
試しにmariadbを使ってみる
diff --git a/docker-compose.yml b/docker-compose.yml
index 72ad7cd798..d3ff677ca6 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
version: '3'
services:
db:
- image: mysql:x.y.z
+ image: mariadb:x.y.z
mariadbを起動
[g@M1Max note (develop)]$ dc up db
[+] Running 12/12
⠿ db Pulled 47.5s
⠿ xxxxxxxxxxxx Pull complete 14.4s
〜〜〜〜
[+] Running 1/1
⠿ Container xxxx_db_1 Created 0.2s
Attaching to db_1
OKそうに見える
[g@M1Max note (develop)]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxxxxxxxxxxx mariadb:x.y.z "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp xxxx_db_1
xxxxxxxxxxxx redis:latest "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:6379->6379/tcp xxxx_redis_1
redisとdbが起動したので、app本体を起動
[g@M1Max note (develop)]$ dc up app
〜〜〜〜
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 3/0
⠿ Container xxxx_redis_1 Running 0.0s
⠿ Container xxxx_db_1 Running 0.0s
⠿ Container xxxx_app_1 Created 0.1s
Attaching to app_1
お、意外と起動してそう
root@xxxxxxxxxxxx:/app# uname -m
aarch64
M1対応イメージで動いているっぽい。
root@xxxxxxxxxxxx:/app# bundle install
〜〜〜〜
Bundle complete! 210 Gemfile dependencies, 441 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
bundle installも完了してる
rails sしてみる
トップページは表示出来た
rspecしてみる
root@d3dbede19bfb:/app# rspec
Randomized with seed 45604
〜〜〜〜
*** stack smashing detected ***: <unknown> terminated
Aborted
Aborted!!!
よくよく追っかけて見ると
= > mini_racer(libv8-node)が落ちる
mini_racerのバージョンを上げる事でM1 Mac上では起動するようになるが
そうするとIntel Mac上で起動しなくなる
解決方針
双方の環境が混在している状況になるため、Intel MacでもM1 Macでも動く環境の構築を目指す
両方対応が難しかった原因はBundlerのバージョンが古いことで複数環境対応が出来ていなかったため
⇒ bundlerのアップデートで環境問題はクリア(Dockerで起動する前提)
rspecで落ちる(その2)
〜〜〜〜
expected: {"human"=>"26 years ago", "iso"=>"1995-08-14T00:00:00-04:00", "timestamp"=>808372800}
got: "{\\"human\\"=>\\"26 years ago\\", \\"timestamp\\"=>808372800, \\"iso\\"=>\\"1995-08-14T00:00:00-04:00\\"}"
(compared using ==)
Diff:
@@ -1,4 +1,2 @@
-"human" => "26 years ago",
-"iso" => "1995-08-14T00:00:00-04:00",
-"timestamp" => 808372800,
+"{\\"human\\"=>\\"26 years ago\\", \\"timestamp\\"=>808372800, \\"iso\\"=>\\"1995-08-14T00:00:00-04:00\\"}"
hash型で欲しいテスト結果がstringで帰ってくる不思議現象
解決方針
mariadbの設定か何かでクリア出来そうな気もするが、本番に合わせる意味合いで
そっちを調査するよりはMySQLで環境が作れた方が良さそう
⇒結果
MySQLをソースコードからコンパイルしたDockerイメージを作成する
MySQLをソースコードからコンパイルするようにDockerfileを作成
マルチプラットフォーム対応にしたイメージをDocker hub(and aws ECR)にプッシュする事で
同じイメージをpullしてもIntel MacとM1 Macで起動する状態を構築したい
ということで、Intel Mac、M1 Mac両方とも使えるDockerイメージをpushしてMySQL環境を起動出来るようにする
nokogiri問題
ひとまず新しくコンパイルしたMySQLも順調に起動し、rspecはクリアできそう、と思ったのもつかの間、今度はnokogiriを使う部分で落ちる。
nokogiriのバージョンが古いために落ちているようだったので、上げようとするも、上げるためにはDockerfileの中でFROMで指定しているイメージのOSを上げる必要がありそう。
うーんruby:2.x.yのイメージで、bullseyeのバージョンのイメージは公式にない。
うん、作ろう!
という事で、こちらもMySQLと同様にOSのバージョンがbullseyeの物をベースにした2.x.yのイメージを独自に作ってこちらを使用するようにしました。
OSもbullseyeになったし
やっとnokogiriのバージョンアップもする事が出来まして
M1Macで無事サーバサイドを起動する事が出来ました。
この記事が気に入ったらサポートをしてみませんか?