Dockerを用いてlaravelの環境構築を試みている時に起こったエラーです。
開発環境
Docker 20.10.5
docker-compose 1.28.5
php 7.2
laravel 7.30.4
Composer 2.0.12
MySQL 8.0
nginx 1.15.12-alpine
エラー
Dockerで作成したコンテナに入り、MySQLに接続するために
php artisan migrate
を実行するとターミナルに下記のエラーが表示される。
Illuminate\Database\QueryException
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = development and table_name = migrations and table_type = 'BASE TABLE')
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
667| // If an exception occurs when attempting to run a query, we'll format the error
668| // message to include the bindings with SQL, which will make this exception a
669| // lot more helpful to the developer instead of just the database's errors.
670| catch (Exception $e) {
> 671| throw new QueryException(
672| $query, $this->prepareBindings($bindings), $e
673| );
674| }
675|
+36 vendor frames
37 artisan:37
Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
解決策
調べてみると上記エラーは.env
でホスト名が間違ってる時に出るものだそうです。
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_local
DB_USERNAME=laravel_user
DB_PASSWORD=laravel123
version: '3'
services:
#省略
mysql:
image: mysql:8.0
container_name: app_db
ports:
- 3306:3306
environment:
MYSQL_DATABASE: laravel_local
MYSQL_ROOT_USER: root
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: laravel_user
MYSQL_PASSWORD: laravel123
TZ: 'Asia/Tokyo'
volumes:
- ./docker-config/mysql/data:/var/lib/mysql
- ./docker-config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
depends_on:
- mysql-volume
mysql-volume:
image: busybox
volumes:
- ./docker-config/mysql/data:/var/lib/mysql
#省略
.env
の中のDB_HOST=db
が誤ってるということなので調べてみると、
DB_HOSTはserviceの名前らしいです。
今回はdocker-compose.yml
でmysqlと命名しているので合わせる必要があります。
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel_local
DB_USERNAME=laravel_user
DB_PASSWORD=laravel123
これで再度コンテナ内でphp artisan migrate
を実行すれば上記のエラーは解消されます。
おまけ(SQLSTATEエラー)
このエラーは.env
のどこの設定が間違っているかで表示されるものが違うんじゃないかと思い、ロールバックして試してみます。
DB_CONNECTION
が異なる場合
Database connection [DB] not configured.
DB_PORT
が異なる場合
SQLSTATE[HY000] [2002] Connection refused
DB_HOST
が異なる場合
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
DB_DATABASE
が異なる場合
SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'%' (using password: YES)
DB_USERNAME
が異なる場合
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
DB_PASSWORD
が異なる場合
SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'%'