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件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です