dockerコンテナ内のlaravelプロジェクトでphp artisan migrateがなかなかうまく行かなかったのでその解消法について書いていきます
環境
- Laravel Framework 8.61.0
- PHP 8.0.11
- Docker 20.10.8
- docker-compose 1.29.2
エラー内容
laravelコンテナ内でphp artisan migrate
するとSQLSTATE[HY000] [2002] No such file or directory
とエラーが出る
$ docker exec -it app php artisan migrate
Illuminate\\Database\\QueryException
SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = laravel-blog and table_name = migrations and table_type = 'BASE TABLE')
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:692
688▕ // If an exception occurs when attempting to run a query, we'll format the error
689▕ // message to include the bindings with SQL, which will make this exception a
690▕ // lot more helpful to the developer instead of just the database's errors.
691▕ catch (Exception $e) {
➜ 692▕ throw new QueryException(
693▕ $query, $this->prepareBindings($bindings), $e
694▕ );
695▕ }
696▕ }
+33 vendor frames
34 artisan:37
Illuminate\\Foundation\\Console\\Kernel::handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
原因
.env
ファイルで定義しているDB設定のうちホスト名がDBコンテナのサービス名と異なっている
DB_CONNECTION=mysql
DB_HOST=127.0.0.1 # ここと
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=password
version: "3.9"
services:
app:
container_name: app
build: ./infra/php
volumes:
- ./code:/code
web:
container_name: web
build: ./infra/nginx
ports:
- 10080:80
volumes:
- ./code:/code
db: # ここが一致していない
container_name: db
build: ./infra/mysql
volumes:
- db-store:/var/lib/mysql
ports:
- 3306:3306
volumes:
db-store:
解決策
.env
ファイルの DB_HOST
を docker-compose.yml
のdbコンテナのサービス名に一致させる
DB_CONNECTION=mysql
DB_HOST=db # ここ
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=password
修正したらdocker exec -it app php artisan migrate
を実行
$ docker exec -it app php artisan migrate
Nothing to migrate.
問題なく実行できました
以上が"No such file or directory"
の解消法になります