環境
- MacBook Air 2020 Apple M1
- macOS: Monterey 12.7.6
- Docker Desktop v4.37.2
- Dockerイメージ: mysql:5.7
起こったこと
Docker Desktop4.37.2で $ docker-compose up -d
をするも、なぜかMySQL 5.7のコンテナだけ起動できませんでした。
# コンテナを起動
$ docker-compose up -d
[+] Running 8/8
✔ Network example_default Created 0.1s
✔ Volume "example_php-fpm-socket" Created 0.0s
✔ Volume "example_db-store" Created 0.0s
✔ Container example-web Started 2.3s
✔ Container example-node Started 2.4s
✔ Container example-db Started 2.4s
✔ Container example-app Started 2.3s
✔ Container example-https Started
# コンテナが起動しているか確認
$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
example-app example-app "docker-php-entrypoi…" app 8 seconds ago Up 6 seconds 9000/tcp
example-https steveltn/https-portal:1 "/init" https-portal 8 seconds ago Up 5 seconds (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
example-node node:14.2-buster "docker-entrypoint.s…" node 8 seconds ago Up 6 seconds
example-web example-web "/docker-entrypoint.…" web 8 seconds ago Up 6 seconds 80/tcp
=> $ docker-compose ps
の結果にdbコンテナexample-db
だけが存在しません。。
調査
$ docker-compose logs db
でdbコンテナのログを確認。
$ docker-compose logs db
example-db | 2025-01-13 03:03:52+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.44-1.el7 started.
..省略..
# 「qemu」に注目
example-db | qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation faultでコケていることがわかり、qemuのエラーメッセージを頼りにこちらの記事に辿り着きました↓
原因については以下の通り記載されていました。
MySQL 5.7の公式Dockerイメージにはarm版が存在せず、amd版をApple Silicon上で動作させていたが、バージョンが上がったことでqemuでは動作しなくなった模様。
qemuではなくRosettaを使うように設定を変更することで、動作するようになった。
=> Rosettaを使うように設定してあげればよさそう、ということがわかりました。
対処法
Rosettaを使うように設定する手順を記載します。
1: まずは↑の記事に書かれている通り、macOSのバージョンをVentura
以降にあげましょう(けっこー時間かかります・・)
macOSがMonteleyではこの設定項目が表示されずRosettaが使えないようなので、その場合はVentura以降にOSバージョンを上げればよい
2:Docker Desktopの右上メニューから、歯車マーク(Settings)をクリック
3:左メニューからGeneral
を選択
4:「Virtual Machine Options」で Apple Virtualization framework
を選択
5: Use Rosetta for x86/amd64 emulation on Apple Silicon
がアクティブになるので、チェックを入れる
6: 右下のApply & Restart
をクリック
7: コンテナを削除 → 再起動
# ボリュームごとコンテナを削除
$ docker-compose down -v
# コンテナを起動
$ docker-compose up -d
私の場合はこれで無事にdbコンテナが起動するようになりました!
まとめ
dockerには詳しくないので、コンテナの再起動方法などは雰囲気で書いてしまってますが。。。
同様のエラーでお困りの方の参考になれば幸いです!