現在、エンジニアを目指して学習中です。
Sail環境でマイグレーションを実行しようとしたところ、
エラーが発生したので、メモしておきます。
環境
・PHP 8.1.13
・Laravel 9.3.12
・MySQL 8.0.31
・Docker 20.10.2
・Laravel Sail
エラー内容
Sail環境で、マイグレーションを実行しようとしたら、エラーが発生。
sail artisan migrate
Illuminate\Database\QueryException
SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = プロジェクト名 and table_name = migrations and table_type = 'BASE TABLE')
指定のファイル・ディレクトリが見つからず、SQLを実行できないというエラー。
つまり、データベースとの接続がうまくいっていない。
確認したけど効かなかったこと
1. config/database.php
のunix_socket
の設定
これは正しく設定されていた。
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'DBname'),
'username' => env('DB_USERNAME', 'hoge'),
'password' => env('DB_PASSWORD', 'hogehoge'),
'unix_socket' => env('DB_SOCKET', '/var/lib/mysql/mysql.sock'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : []
],
2. .env
ファイル
この設定も問題なし。
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=DBname
DB_USERNAME=hoge
DB_PASSWORD=hogehoge
3. コマンドライン上でsail mysql
の実行
MySQLには入れたので、接続も正しくできている。
原因
上述したunix_socketを設定してしまっていたことが、逆に今回の原因。
MAMP環境ではunix_socketを設定していたので、
そのまま設定していたが、コンテナ環境の場合には要らないらしい。
Because you are trying to connect to DB container via socket from different container.
There are two separate containers - Laravel and MySQL. Thinks of it like two separate servers.
When you have both unix_socket and db_host in env, you are telling laravel to connect to db at specified host via unix_socket. That is why it didn't work.
When you update the unix_socket env, laravel try to connect to DB via TCP and it work.
unix_socketとdb_hostの両方を設定すると、unix_socketが優先されるが、
unix_socketでは二つのコンテナ間をうまく通信できないらしい。
だから、コンテナ環境の場合はunix_socketの設定は不要。
'mysql' => [
// 必要な部分周辺以外略してます。
'database' => env('DB_DATABASE', 'DBname'),
'username' => env('DB_USERNAME', 'hoge'),
'password' => env('DB_PASSWORD', 'hogehoge'),
// unix_socketの第二引数を空に変更
'unix_socket' => env('DB_SOCKET', ''),
],
これでマイグレーションが実行できるようになりました。
ソケットについてはこんな記事が。
通信、ネットワーク系の勉強もしていかないとなあ。。
参考