Breathnote
Docker × Laravel × MySQL:データベースのマイグレーション中にエラー(Connection refused ...)

Docker × Laravel × MySQL:データベースのマイグレーション中にエラー(Connection refused ...)

この記事を参考に、LaravelのDocker環境を構築したのですが、データベースのマイグレーションでエラーが発生しました。エラーの原因はつまらないものでしたが、備忘録として残しておきます。

エラー内容

shell
user@Desktop:~/workspace/project$ make fresh
docker compose exec app php artisan migrate:fresh --seed

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] Connection refused (SQL: SHOW FULL TABLES WHERE table_type = 'BASE TABLE')

  at /work/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [2002] Connection refused")
      /work/backend/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=forge", "forge", "", [])
      /work/backend/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.
make: *** [Makefile:74: fresh] Error 1

原因

Dockerの環境変数が、Laravelの環境変数を上書きできていませんでした。

Docker側のDB接続設定は以下のとおり。

docker-compose.yml
services:
  app:
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_PORT=3306
      - DB_DATABASE=laravel
      - DB_USERNAME=root
      - DB_PASSWORD=secret

しかしエラーにはPDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=forge", "forge", "", [])とあります。

LaravelのDB設定を確認。

database.php
'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST_1', '127.0.0.1'),
        'port' => env('DB_PORT_1', '3306'),
        'database' => env('DB_DATABASE_1', 'forge'),
        'username' => env('DB_USERNAME_1', 'forge'),
        'password' => env('DB_PASSWORD_1', ''),
    ],
],

Docker側で指定した環境変数名と、プロジェクトで利用されている環境変数名が異なっていました。

解決策

環境変数名を既存プロジェクトの名称で統一しました。

docker-compose.yml
services:
  app:
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST_1=db
      - DB_PORT_1=3306
      - DB_DATABASE_1=laravel
      - DB_USERNAME_1=root
      - DB_PASSWORD_1=secret

php artisan config:clearでキャッシュを削除して再挑戦。

shell
docker compose exec app php artisan migrate:fresh --seed

Dropped all tables successfully.
Migration table created successfully.
Database seeding completed successfully.

うまくいきました。