今回はdocker環境を用いたLaravelでphp artisan migrate
出来たので、自分が詰まった部分とその解決方法について共有していきたいと思います。
自分のdocker-compose.ymlと.envファイル
version: "3"
services:
app:
ports:
- "80:80"
build: ./docker/app
container_name: laravel_app
volumes:
- ./src:/var/www/html
db:
image: mysql:5.7
container_name: laravel_db
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel_db
MYSQL_USER: laravel_user
MYSQL_PASSWORD: laravel_pass
TZ: "Asia/Tokyo"
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
ports:
- 3306:3306
volumes:
- ./docker/db/data:/var/lib/mysql
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
phpmyadmin:
image: phpmyadmin/phpmyadmin:5
container_name: phpmyadmin
links:
- db
ports:
- 8080:80
volumes:
- ./docker/phpmyadmin/sessions:/sessions
DB_CONNECTION=mysql
DB_HOST=larvel_db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass
この状態でphp artisan migrate
そうすると...erorrが帰ってきました。残念。
# php artisan migrate
Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'192.168.80.4' (using password: YES) (SQL: select * from information_schema.tables where table_schema = laravel_db and table_name = migrations and table_type = 'BASE TABLE')
at /var/www/html/laravelblog/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
665| // If an exception occurs when attempting to run a query, we'll format the error
666| // message to include the bindings with SQL, which will make this exception a
667| // lot more helpful to the developer instead of just the database's errors.
668| catch (Exception $e) {
> 669| throw new QueryException(
670| $query, $this->prepareBindings($bindings), $e
671| );
672| }
673|
取り組んだ手順
.env
のDB=HOST
をcontainer_nameであるlaravel_dbではなく、service名のdb
を指定してあげる。
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass
・ 変更後にコンテナを立ち上げ直す!
$ docker-compose down
$ docker-compose up -d
・ phpが入っているlaravel_appコンテナ内に入る。
・ laravelのプロジェクト(laravel_blog)に移動してあげれば...
$ docker exec -it laravel_app bash
//laravel_appコンテナ内
# cd laravelblog
php artisan make:model
は出来ました!けども
# php artisan make:model Article --migration
artisan make:model Article --migration
Model created successfully.
Created Migration: 2022_04_28_005924_create_articles_table
肝心な php artisan migrate
はまだ通らない。
# php artisan migrate
1 PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'192.168.128.4' (using password: YES)")
/var/www/html/laravelblog/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
「Laravel環境で使用するユーザーを作成していないという重大なミス!!」 ここ大事。
なぜ出来ないんだ!!と脳内発狂していたのですが、ふと「.env
やdocker-compose.yml
で設定したユーザー名がMySQLに存在していなくね?」という疑問が浮かびました。
phpmyadminを開き、DB_USERNAMEで使われているlaravel_userとDB_PASSWORDのlaravel_passでホスト名は「%」で新規ユーザーを追加しました。
すると...
# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.09 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.05 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.04 seconds)
Migrating: 2022_04_28_005924_create_articles_table
Migrated: 2022_04_28_005924_create_articles_table (0.04 seconds)
無事、php artisan migrate
出来ました!
.env
やdocker-compose.yml
で設定したユーザー名をデータベース上に追加しなくちゃいけないというのは盲点でしたが解決できましたね。
今回は手っ取り早くphpmyadminを使いましたが、構築環境にphpmyadminがない場合はMySQLのイメージが入っているlaravel_dbコンテナに入り、そこから更にMySQLにログインして新規ユーザーを追加するやり方もあるみたいです。気になる人はネットで調べてみてください。
やってみた感想
初心者からするとdockerで構築していくのは中々ハードルが高いですが、解決できてよかったです。
今回の記事はおそらくハマりポイントの一つだと思うので、少しでも参考になれば嬉しいです!
記事とは関係ないですが、laravelとdockerが一緒に組み込まれたlaradockというイメージもあるみたいなので余裕があれば、そちらも確認したいと思いました。
参照