はじめに
Apple Silicon(M3)Mac上で Docker を使って開発していて、MySQL コンテナに入ってから mysql に接続できない問題に直面しました。
今回の問題解決を通して、DockerイメージのアーキテクチャとホストPCのアーキテクチャの違いの吸収が必要なことがあること、またMySQLイメージの仕様について理解が深まりました。
発生した問題
-
docker exec -it mysql-container bash
で MySQL に入ってから
mysql -u root -p
を実行してもAccess denied
になって、mysql に接続できない。
.env
やdocker-compose.yml
にユーザーやパスワードは設定済み。 -
docker-compose down -v
を実行すると、nginx
が起動できない。
原因:MySQL の初期化は「最初の1回だけ」
MySQL公式イメージは、初回起動時にだけ以下の環境変数を読み込んで、初期化する仕様になっている。
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: image_hosting
MYSQL_USER: image_hosting_user
MYSQL_PASSWORD: image_hosting_pass
一度ボリューム(mysql-data
)が作られると、再起動しても初期化処理は実行されない。
解決策:ボリュームごと削除して初期化し直す
docker-compose down -v
docker-compose up -d --build
これで MySQL が初期化され、設定したユーザー・パスワードが反映されるはずだったが、
The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8)
ということで、次の原因を解明する。
原因:アーキテクチャの不一致
Apple Silicon(arm64)Mac上で、Intel(amd64)向けのDockerイメージを起動しようとするとエラーが発生する。
解決策:platformを明示してエミュレート実行
services:
nginx:
image: nginx:latest
platform: linux/amd64
ports:
- "8080:80"
volumes:
- ./app:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
platform: linux/amd64
を指定することで、
ARM マシン上でも エミュレーションで amd64 バイナリが実行可能になる。
まとめ
今回の学びを通して
- dockerを使う場合は、使っているイメージの仕様の理解が大切。
- ホストPCとLinuxのアーキテクチャが異なる場合は注意が必要。
ということを学びました
ちなみに、以前記載した以下の記事が今回の問題解決に必要な知識の土台になりました。
ということで、コンピュータサイエンス学ぶとDockerのエラーに対応する力が高まるということを実感しました!