【.envの書き方】dockerでLaravel環境を作った時に、php artisan migrateでエラーが出る!? 環境を作りながら解いてみる。

Laravel

今回はLaravelの環境をDockerで作った時に陥りやすいミスを紹介します!

Laravelをインストールして、いつも通りに設定したのに何かうまくコマンドが動かない。

php artisan migrateがなぜかエラーが出る!解決しましょう!!

以下のバージョンでやります。

Laravel 8.x
mysql 8.x
php 8.x

結論

今回の場合はLaravelの.envの書き方が悪かったのです。

間違えていた.envの書き方↓

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE={データベース名}
DB_USERNAME={データベースユーザ名}
DB_PASSWORD={データベースPW}

修正した.envの書き方↓

DB_CONNECTION=mysql
DB_HOST={container名}
DB_PORT=3306
DB_DATABASE={データベース名}
DB_USERNAME={データベースユーザ名}
DB_PASSWORD={データベースPW}

そう、DB_HOSTにはコンテナ名を書かないといけなかったんですね!

通常のLarvelだと、127.0.0.1(ローカルホスト)とかにローカル環境の時はなると思います。

しかしよく考えたら今回はDockerで環境を作っているので、接続するのはphpのコンテナから、mysqlのコンテナに接続をしないといけないわけですね....

そりゃそうだ。

ではもう少し詳しくどんな環境で作ったのか紹介しましょう。

Dockerの準備

まずdocker_compose.yaml

version: "3.8" #yamlのバージョン 2021/10/12 時点最新 https://docs.docker.com/compose/compose-file/

services:
  php:
    container_name: test_code_php #container名の指定
    #image: {image名} 今回はbuildがあるのでコメントアウト
    build: ./docker/php #Dockerfileのあるディレクトリのpathを指定
    tty: true #docker-compose upでコンテナを起動させた時に、コンテナを起動させ続ける
    networks: #サービスごとにどのネットワークに接続するのかを指定
      - default #docker network lsで確認可能
    ports:
      - ${MY_IP}:${WEB_PORT}:80 #ホストIP:ホスト:コンテナ ${WEB_PORT}のポートがきたら、80のポートを使う
    volumes: #pathをvolumeとしてマウントする。
      - ${PROJECT_PATH_HOST}:/var/www/html

  mysql:
    container_name: test_code_mysql
    #image:
    build: ./docker/mysql
    tty: true
    expose: #マシン上にポートを露出するが公開はされない。リンクされたサービスのみアクセスができる
      - "3306" #mysqlにアクセスが可能
    volumes:
      - ./DBdata:/var/lib/mysql
      - ./conf/mysql/my.cnf:/etc/mysql/conf.d/my.cnf #my.cnfにmysqlの設定ファイルを書いてマウントする
    environment: #環境変数の追加
      MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DB_NAME}
      MYSQL_USER: ${MYSQL_USER_NAME}

docker-compose.yamlで変数を読んでいたので、.envに書き込みます。

PROJECT_PATH_HOST=./html

MY_IP=127.0.0.1
WEB_PORT=80

MYSQL_PASSWORD=test123
MYSQL_DB_NAME=test_code
MYSQL_USER_NAME=root

そしてDockerfileも書いていきます。

mysqlのDockerfile

FROM mysql:8.0.26

phpのDockerfile

今回のプロジェクト名はlaravel_test_codeです。

FROM php:8.0-apache-buster
RUN apt-get update

# composerのインストール
COPY --from=composer /usr/bin/composer /usr/bin/composer

# other tools install
RUN apt-get install -y vim \
&& apt-get install -y \
git \
unzip

# ドキュメントルートをpublic配下に指定
ENV APACHE_DOCUMENT_ROOT /var/www/html/laravel_test_code/public
ENV APACHE_DOCUMENT_ROOT /var/www/html/laravel_test_code/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

# ドライバのインストール
RUN docker-php-ext-install pdo_mysql mysqli

## mod_rewriteを有効化する
RUN cd /etc/apache2/mods-enabled \
    && ln -s ../mods-available/rewrite.load

いい感じですね。

それでは作業進めていきましょう!

各自必要な形でファイルの中身を修正してください。

  1. docker/php/Dockerfile のプロジェクト名を修正
  2. docker-compose.yamlのcontainer_nameを指定
  3. .envファイルの修正
  4. laravelの.envの修正(インストール後)

環境作成

では準備ができたので、コマンドを叩いていきましょう。

docker-compose build
docker-compose up

#コンテナにログイン
docker exec -it test_code_php bash

#Laravelのインストール(初期操作以外は必要無し)
composer create-project laravel/laravel laravel_test_code "8.*"

#このままだとアクセスできないので権限を変更
chmod 777 -R storage/

はい!ここでphp artisan migrateをするとエラーになるはず!

しっかりlaravelの.envを書いていきましょう!

大体必要なところは以下だと思います。

APP_NAME={プロジェクト名}

DB_CONNECTION=mysql
DB_HOST={コンテナ名}
DB_DATABASE={DB名}
DB_USERNAME={ユーザ名}
DB_PASSWORD={パスワード名}

大体docker-compose.yamlファイルで定義したところだと思います!

では、ログインしてmigrationしてみます。

    docker exec -it {コンテナ名} bash
    cd {プロジェクト名}

    php artisan migrate

ほい!これで良い感じかと思います!

なれたらすぐにできるかと思います!

まとめ

過去にエラーあったけど何が問題だったかわからない。

なにかあったけどなあ....

あるあるだと思います。

そんな時はエラーメモでも作ってみましょう。

コメント

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