🚷

Laravel Sail 上でデータベースに接続できない場合の対処方法

2024/08/10に公開

こんにちは。 SAW です。
最近、人生で初めてなんばグランド花月に行ってきました。
吉本新喜劇を見るのは久々でしたが、年月が経っても面白いと思いました。

既存の Laravel プロジェクトで、 Sail を使ってデータベースの migration を実行したところ、 Connection refused というエラーが発生し、データベースへの接続に失敗しているようでした。

本記事では、既存のプロジェクトについて Laravel Sail 上でデータベースに接続できない場合の対処方法について紹介します。
なお、本記事では Laravel のバージョンが 10.x 系 を前提としています。

対象読者

本記事で想定する読者層は次の通りです。

  • Laravel について基本的な知識を有している
  • Docker について基本的な知識を有している

エラーの内容

既存の Laravel プロジェクトを clone し、 Laravel Sail を利用して migration を実行しようとしたところ、以下のようなエラーが出力されました。

artisan migrate の実行で出力されたエラー
   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2002] Connection refused
  (Connection: mysql, SQL: select * from information_schema.tables
    where table_schema = backend and table_name = migrations
    and table_type = 'BASE TABLE')

エラーメッセージを確認する限りだと、データベースに接続できていないようです。

原因

.envDB_HOST の値が 127.0.0.1 になっており、 データベースの接続先が Laravel Sail の MySQL コンテナに向いていなかった ことが原因でした。

Laravel のプロジェクトを作成するとき、 .env の雛形として .env.example が作成されます。
特に変更を加えない場合、 .env.exampleDB_HOST には 127.0.0.1 が設定されています。

https://github.com/laravel/laravel/blob/7effeb99ec1568f006ed95e60d3e7dfeed1b8160/.env.example#L12

そのため、 .env.env.example からコピーして作成する場合、 DB_HOST の値を書き換える必要があります。

解決方法

データベースの向け先を MySQL コンテナに向けるために、 .envDB_HOST の値を 127.0.0.1 から mysql に書き換えました。

.env の変更内容
 DB_CONNECTION=mysql
-DB_HOST=127.0.0.1
+DB_HOST=mysql
 DB_PORT=3306

上記の内容に書き換えることで、 migration が問題なく実行できるようになりました。

まとめ

本記事のまとめは以下の通りです。

  • Laravel Sail 上でデータベースに接続できない場合の対処方法を紹介
    • .envDB_HOST を値を mysql に変更

.env.example からコピーして .env を作成する場合は、環境変数の設定内容をちゃんと確認しないといけないなと思いました。

参考文献

https://stackoverflow.com/questions/65576513/laravel-sail-database-connection-refused-error

Discussion