Laravel

Laravelのmigrateエラー"No such file or directory"【Laravel×Docker】

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_HOSTdocker-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" の解消法になります

-Laravel