AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

AppleSillicon 環境で Lima + Docker on MongoDB を動かす際に気をつけること

基本的に 5.x, 6.0.x は現状動かないので、メンテナンスされている 4.4.x を使うか、 どうしても 6.0.x を利用したい場合は brew からインストールして使いましょう。

ナンデ!?

docker pull 時に Docker 自体が利用環境に応じて最適なアーキテクチャを選んでくれる。 M1, M2 は ARM 系列なんだけど lima で動かしているとだいたい x86_64 の Docker が起動しているはず。 いざこの状態で docker pull すると mongoDB が起動しない。

hub.docker.com

例えばこの記事を書いてる時点では 6.0.4 が最新なんだけど、 pull してきた後に起動すると以下のように怒られる。

❯ docker run -v /tmp/lima:/data -p 27017:27017 mongo:6.0.4

WARNING: MongoDB 5.0+ requires a CPU with AVX support, and your current system does not appear to have that!
  see https://jira.mongodb.org/browse/SERVER-54407
  see also https://www.mongodb.com/community/forums/t/mongodb-5-0-cpu-intel-g4650-compatibility/116610/2
  see also https://github.com/docker-library/mongo/issues/485#issuecomment-891991814

これは docker を動かす lima のバックエンドである qemu が AVX をサポートしていないから、らしい。

公式にも色々書いてあるけど Rosetta2 の有無で動作が変わる、例えば brew 経由でバイナリインストールしたら Docker なくても動くよね実際動くし、と言及がある。

www.mongodb.com

At the moment, running natively on Apple M1 is referring to using Rosetta 2 without Docker (for example, installing the macOS x86_64 binaries via brew 48). The macOS packages are working fine for me on M1 with Rosetta 2 installed.

現時点では、Apple M1 でネイティブに実行するということは、Rosetta 2 を Docker なしで使用することを指しています (たとえば、brew 48 を介して macOS x86_64 バイナリをインストールします)。 macOS パッケージは、Rosetta 2 がインストールされた M1 で正常に動作しています。

で、なんで M1 + Lima (x86_64) の Docker で動かないかと言うと以下とのこと。

This discussion was originally about someone trying to run the Linux x86_64 binaries in Docker on M1, which will be problematic because of the requirement for AVX support in MongoDB 5.0 packages for Linux x86_64 39. The solution for the original question would be to either install MongoDB 4.4 packages on Linux (since those are not optimised for AVX) or to build MongoDB 5.x from source 22 with an older x86_64 CPU architecture target.

この議論はもともと、M1 上の Docker で Linux x86_64 バイナリを実行しようとしている人に関するものでした。これは、Linux x86_64 の MongoDB 5.0 パッケージでの AVX サポートの要件のために問題となるでしょう 39. 元の質問に対する解決策は、MongoDB をインストールすることです。 Linux 上の 4.4 パッケージ (これらは AVX 用に最適化されていないため)、または古い x86_64 CPU アーキテクチャ ターゲットを使用してソース 22 から MongoDB 5.x をビルドします。

まあやっぱり AVX が問題なんだワ、とのこと。

じゃあ aarch なり arm64 を選んだらどうなんの、と思ったら以下との事。

Building the MongoDB server with ARM64/aarch64 support for MacOS (SERVER-50115 106) is currently blocked pending resolution of a SpiderMonkey JavaScript engine upgrade (SERVER-42427 61).

MacOS 用の ARM64/aarch64 サポートを備えた MongoDB サーバーの構築 (SERVER-50115 106) は、SpiderMonkey JavaScript エンジンのアップグレード (SERVER-42427 61) の解決が保留されているため、現在ブロックされています。

ということで

結構前の記載だったんだけど、なんか先行きよくないのと結構詰まってしまったので自分向けに。

実際データベースアダプタとかで接続してて、 v4.x と v6.0.x 系でコンフィグ変更せずにいけるとかなら、M1 (ARM) 系は 4.x、それ以外は 6.0.x とか思い切ってバージョン違いにしてもいいかもしれない。

実際僕がメンテナンスしているプロジェクトでは、開発環境は 4.x で統一して、本番環境は 6.0.4 を使うことにした(少しでもパフォーマンス稼ぎたい要件が出てきたので)。