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.
うまくいきました。