Laradockでmigrateが出来ない時の対応方法【環境構築】

プログラミング
この記事は約16分で読めます。

先日、個人開発でLaradockを用いてサーバ環境構築を行いました。

Laradock
Full PHP development environment for Docker.

今回はDocker環境でLaravelの環境構築を簡単に出来るLaradockを使用した時にハマったポイント(migrateが出来るまで)を纏めたいと思います!

環境構築手順

Laradock公式ページ

https://laradock.io/getting-started/

を基に環境構築をしていきます。今回はPHPのファイルが一切ない状態から始めます。

LaradockのリポジトリをCloneする

まずはLaradockをローカル環境にダウンロードする必要があります。

$ pwd
/Library/WebServer/project

$ git clone https://github.com/Laradock/laradock.git

Laravelのソースコード用のディレクトリを作っておく

$ pwd
/Library/WebServer/project

# src という名前で用意
$ mkdir src

$ ls -l
total 0
drwxr-xr-x  82 suzukitakashi  wheel  2624  9 21 20:47 laradock
drwxr-xr-x   2 suzukitakashi  wheel    64  9 21 20:52 src

Laradockディレクトリ内で env-example を .env にコピーする

$ cd /Library/WebServer/project/laradock

$ cp env-example .env

この .env ファイルが環境構築をする上での設定ファイルになります。

.envファイルに先程作成したLaravelソースコード用のパスを指定する

###########################################################
###################### General Setup ######################
###########################################################

### Paths #################################################

# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../src ←ここを修正

You can edit the .env file to choose which software’s you want to be installed in your environment. You can always refer to the docker-compose.yml file to see how those variables are being used.

.envファイルを編集して、環境にインストールするソフトウェアを選択できます。
いつでもdocker-compose.ymlファイルを参照して、これらの変数がどのように使用されているかを確認できます。

https://laradock.io/getting-started/

公式に書いてあるように docker-compose.yml を確認し、.env で対応した箇所の設定を行うことでlaradockをカスタマイズしていきます。

基本的にはこの流れで環境構築が可能です。

コンテナーを立ち上げる

$ pwd
/Library/WebServer/project/laradock

$ docker-compose up -d nginx mysql

-d オプションはデタッチモードを示し、このオプションがないとバッググラウンドでサーバーが立ち上がりません(control + c でシャットダウンしてしまいます)

今回は nginxmysql のみコンテナを立ち上げます。

が、nginxのようなサーバーコンテナを立ち上げると自動で必要なコンテナも一緒に立ち上がります。

Creating laradock_mysql_1            ... done
Creating laradock_docker-in-docker_1 ... done
Creating laradock_workspace_1        ... done
Creating laradock_php-fpm_1          ... done
Creating laradock_nginx_1            ... done

完了すると上記の5つのコンテナが立ち上がっているのがわかります。

なお、この引数となっている nginx mysql については docker-compose.yml に定義されています。

ApachePostgreSQL を使いたい場合はこの引数を変えれば、それぞれのコンテナを立ち上げることができます。

コンテナにアクセスする

docker-compose exec workspace bash

上記コマンドでコンテナにアクセスします。

この例では workspace というソースコードを管理するコンテナにアクセスしています。

※注意!

docker exec -it {workspace-container-id} bash

他のブログでたまに見かける上記の書き方はWindows用のアクセス方法です。

環境をよく確認して実行しましょう!

Laravelのコードをダウンロードする

workspaceコンテナに入っても何もないかと思います。

ここにLaravelのコードをダウンロードします。

公式の手順とは少し逸れますが、公式のドキュメントを元に進めます。

Laradock
Full PHP development environment for Docker.

workspaceのコンテナにアクセスする

ここは上記手順で既に入っているので割愛します

Laravelをインストールする

composer create-project laravel/laravel myTools "6.0.*"

今回は src という名前で LaravelのVersionは LTS の 6.0 にします

root@fa1daf41e1c0:/var/www# composer create-project laravel/laravel myTools "6.0.*"
Do not run Composer as root/super user! See https://getcomposer.org/root for details

以下のエラーはrootで実行していることが原因です。

公式ドキュメントではアクセス時に

docker-compose exec --user=laradock workspace bash

と、–user=laradock を付けるとlaradockというユーザー名義でアクセスすることができ、Laravel環境を立ち上げることが出来るようになると記載されています。

補足になりますが、上記のlaradockのようなサーバ上で管理されているユーザーの一覧は

cat /etc/passwd

で確認することが出来ます。

.envファイルを編集する

Laravelのインストールが完了すると、最初に設定したソースコード用のディレクトリに新たにLaravelのファイルが追加されます。

それに伴い、一番最初に設定した .env ファイルを書き換える必要があります。

###########################################################
###################### General Setup ######################
###########################################################

### Paths #################################################

# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../src/myTools ←ここを修正

もう一度コンテナを立ち上げ直して設定を反映させる

$ pwd 
/Library/WebServer/project/laradock

$ docker-compose up -d nginx mysql

.envファイルを編集する

Open your PHP project’s .env file or whichever configuration file you are reading from, and set the database host DB_HOST to mysql:

PHPプロジェクトの.envファイルまたは読み取り中のいずれかの構成ファイルを開き、データベースホストDB_HOSTmysql次のように設定します。

https://laradock.io/getting-started/#Usage
DB_HOST=mysql

.envファイルがたくさん出てきてしまい、混乱すると思いますが、ここでは workspace コンテナ内で先程作ったLaravelの .env ファイルを指します。

なお、コンテナの中で編集した結果は、最初に設定したソースコード用のディレクトリに新たにLaravelのファイルにも反映されます。

動作確認

http://localhost/ にアクセス

Laravelの画面が表示されたら成功です!!

ブラウザで正しく表示されない場合、

 $ docker-compose ps

で各コンテナの状態を確認が可能です。

$ docker-compose ps
         Name                   Command           State           Ports
--------------------------------------------------------------------------------
laradock_docker-in-      dockerd-entrypoint.sh    Up      2375/tcp, 2376/tcp
docker_1
laradock_mysql_1         docker-entrypoint.sh     Up      0.0.0.0:3306->3306/tcp
                         mysqld                           , 33060/tcp
laradock_nginx_1         /bin/bash                Up      0.0.0.0:443->443/tcp,
                         /opt/startup.sh                  0.0.0.0:80->80/tcp
laradock_php-fpm_1       docker-php-entrypoint    Up      9000/tcp
                         php-fpm
laradock_workspace_1     /sbin/my_init            Up      0.0.0.0:2222->22/tcp

Up が正常に立ち上がっている状態ですが、Exit が出ている場合、エラーが発生して落ちてしまっています。

問題の切り分けにご活用ください!

発生した問題

MySQLの接続でエラーが発生する

今回の対応で、

php artisan migrate

を行おうとしたところ、エラーが発生してしまったのでその解決法を紹介します。

エラーログ

php artisan migrate

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')

  at /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:665
    661|         // If an exception occurs when attempting to run a query, we'll format the error
    662|         // message to include the bindings with SQL, which will make this exception a
    663|         // lot more helpful to the developer instead of just the database's errors.
    664|         catch (Exception $e) {
  > 665|             throw new QueryException(
    666|                 $query, $this->prepareBindings($bindings), $e
    667|             );
    668|         }
    669|

  Exception trace:

  1   PDOException::("PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]")
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=mysql;port=3306;dbname=laravel", "root", "", [])
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.

対応策

ポイントは

caching_sha2_password

です。MySQLの最新版である MySQL8.0ではログイン認証方式が変更され、デフォルトで caching_sha2_password が使われます。

MySQL 8.0 is a development release. You may prefer to use the latest stable version, or an even older release. If you wish, you can change the MySQL image that is used.

MySQL 8.0は開発リリースです。
最新の安定バージョン、またはさらに古いリリースを使用することをお勧めします。
必要に応じて、使用するMySQLイメージを変更できます。

https://laradock.io/documentation/#change-the-mysql-version

とのことで、caching_sha2_password に立ち向かう記事は沢山あるのですが、公式が推奨していることもあるため、おとなしくバージョンを下げます。

$ pwd
/Library/WebServer/project/laradock

# .envファイルを編集
$ vi .env 
### MYSQL #################################################

MYSQL_VERSION=5.7  # ここを latest から 5.7 に変更
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d

MySQLのバージョンを下げられない

終わったら

$ docker-compose up -d mysql

をして、設定を読み込ませようと思ったらうまく反映されませんでした。

キャッシュを削除して立ち上げる

$ docker-compose build --no-cache mysql

のコマンドでも変わらず…

エラーログ

ログを表示するために -d オプションを消して立ち上げてみたところ、

$ docker-compose up mysql
︙
[ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800!
︙

というエラーを確認しました。

対応策

この不具合は最初にMySQLのVer.8.0を立ち上げた時点で、.env で指定したDATA_PATH_HOSTディレクトリにデータが入ってしまっていることが原因です。

バージョンを下げたVer.5.7のDBの設定データを入れることが出来ずに出ているエラーでした。

###########################################################
###################### General Setup ######################
###########################################################

### Paths #################################################
︙
# Choose storage path on your machine. For all storage systems
DATA_PATH_HOST=~/.laradock/data # ← ここにDBの設定ファイルが貯まる

対応策は2つあり、

rm -rf ~/.laradock/data

で既存のファイルを全て削除するか、

DATA_PATH_HOST=./laradock/data # どこでも可

上記のようにDATA_PATH_HOSTをどこか違う場所に置けばDBを立ち上げることが出来ます。

まとめ

まず最初にブログを読む前に公式のページを見よう

全ての勉強に言えることなのですが、Laradockは日本語対応はされていないので、日本語で説明されている記事に飛びつきがちです。

そのため最初に公式ドキュメントを読まずにQiitaなどのブログを読んで同じ手順でやりたくなります。

しかし、それでは本当の意味での理解にはなりませんし、開発環境の違いでエラーが発生した時にどうしたら良いか分からなくなってしまいます。

公式ドキュメントは世界で一番正しいことを書いている資料です。

今はGoogle翻訳のChrome拡張などを使えば、英語を読めなくてもなんとなく内容を察することが出来るようになりました。

怖がらないで公式のページを読む習慣を付けましょう。

どうしても分からなくなったらQiitaなどを参考にする

MySQLのエラーの解決策に関してはひたすら調べましたが、「Laravel MySQL 立ち上がらない」という検索よりは、エラーログを確認した状態でエラーログを検索した方が確実な情報が手に入りやすいです。

自分がどこまで分かっているか、今の知識でどこまで原因を調査できるか、を少しずつ整理していくと問題解決のスピードは上がっていきます。

さて、これでローカルの開発環境が整ったので何かやっていこうかと思います。

ここまで読んで頂きありがとうございました!

コメント

タイトルとURLをコピーしました