docker ✕ MySQLで、沼にハマった。
Dockerを利用したデータベース接続で複数の問題にぶち当たったので、以下私の解決メモです。
結論からお話すると、
「エラーログの確認」は大正義です。
今回はエラーログの確認方法も分からなかったのでAIに頼りまくって沼っていましたが、
「エラーログの確認方法を教えて」というプロンプトで早めに解決していたかもしれない。
CORS policyで開発環境からのアクセスが弾かれる
エラー内容:Access to XMLHttpRequest at 'http://localhost:8080/v1/user/login' from origin 'http://localhost:5173' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
魔翻訳:クロスオリジン設定ちゃんとしてね。
結論
index.phpの許可するheaderを明示的に指定。
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE, PUT");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
// OPTIONSリクエストが来たら、許可ヘッダーを返して正常終了 (HTTP 200 OK) させる
http_response_code(200);
exit;
}
原因
ブラウザからのプリフライトリクエスト(OPTIONSメソッドを使ったリクエスト)に対して、サーバーが適切な応答をしていなかった。
また、認証設定に「JWT」を利用しているため、Authrizationの許可が必要だった。
header("Access-Control-Allow-Origin: *");の設定だけで大丈夫だと思っていた。
仕組み
使用できるメソッドを返す。
Authorizationを許可する。
念の為、プリフライトリクエストに対して、コントローラー実行ではなく許可ヘッダーのみ返す。
エラー:SQLSTATE[HY000] [2002] ※一番の沼ポイント
エラー内容:「SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for mysql failed: Name or service not known
魔翻訳:「mysql」なんてサービス見つからないよ
結論
compose.ymlのdatabase関連(mysql)設定に、environment項目を追加
environment:
MYSQL_ROOT_PASSWORD: dev_password_root
MYSQL_USER: ***_user
MYSQL_PASSWORD: dev_password
MYSQL_DATABASE: ***_db_dev
原因
docker network logs mysqlの結果
mysql-1 | 2025-10-17 01:48:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.43-1.el9 started.
mysql-1 | 2025-10-17 01:48:51+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql-1 | 2025-10-17 01:48:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.43-1.el9 started.
mysql-1 | 2025-10-17 01:48:52+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
mysql-1 | You need to specify one of the following as an environment variable:
mysql-1 | - MYSQL_ROOT_PASSWORD
mysql-1 | - MYSQL_ALLOW_EMPTY_PASSWORD
mysql-1 | - MYSQL_RANDOM_ROOT_PASSWORD
要約すると、「environment設定が無い」というエラー。
MySQL公式イメージは、セキュリティ上の理由から、起動時に環境変数が設定されていないと、起動プロセスを停止する(らしい)
dockerのMySQLコンテナ起動時に必要な、パスワード環境変数が抜けていた。
余談
ちなみに、もともとenvironmentを設定していたけど、当時相談していたAIに「環境変数はenvファイルから読み込むべきだから消せ」と言われていたので消していた。
AIを鵜呑みにするのは良くないけど、疑う為の知識がなかったので仕方ない。
エラー:SQLSTATE[42S02]
エラー内容:SQLSTATE[42S02]: Base table or view not found:
魔翻訳:データベースにテーブルが見つからないよ
結論
compose.ymlのdatabase関連設定を、webからmysqlへ移動。
mysql:
image: mysql:8.0
volumes:
- mysqldata:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/mysql/setup.sql:/docker-entrypoint-initdb.d/setup.sql
原因
docker compose down -v && docker compose up -d --buildをしていてもエラーが出ていた。(DBリセットしてもエラーが出る)
database関連のvolumesが、phpの定義に指定されていた為、SQL実行のトリガーが動作せず。
DBテーブルが作成されなかった。
その他、エラー処理の更新。
原因切り分けのため、フロントエンドUIに、APIから受け取ったエラー内容を表示。

“docker ✕ MySQLで、沼にハマった。” に対して1件のコメントがあります。