【Docker】LaravelでMySQL8.0を使う

以前、LaravelのMySQL8.0はサポートしていないという記事を書きました。

blog.websandbag.com

2019年6月現在でも状況は同じようです。
認証方式がcaching_sha2_passwordが対応していないのが原因です。

PDOException::("PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]")

そのため、認証方式を変てMySQLの8系でも使えるようにします。

追加方法

MySQLのアカウント のパスワード方式がmysql_native_passwordにすれば解決します。
そのため、ユーザーのパスワード方式を変更するクエリを作って流しこみます。

ファイル構成

ファイルは下記のような構成です。

.
├── docker-compose.yml
├── .env
└── docker
    └── db
      └── Dockerfile

.env

ビルド時に使用するenvファイルです。
docker-compose.ymlでenvironmentに指定する値を設定します。

MYSQL_PORT=3306
MYSQL_DATABASE=(データベース名)
MYSQL_ROOT_PASSWORD=(rootのパスワード)
MYSQL_USER=(追加するユーザーID)
MYSQL_PASSWORD=(追加するユーザーのパスワード)

docker-compose.yml

buildのargsに追加するアカウントのIDとパスワードを指定します。
これで、dockerfile内で変数として使えるようになります。

version: '3.7'
services:
  db:
    build:
      context: ./docker/db
      args:
        MYSQL_USER: ${MYSQL_USER}
        MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    ports:
      - ${MYSQL_PORT}:3306

dockerfile

dockerfile内でdocker-compose.ymlで指定した変数を使う場合は、ARGにargsで指定した変数名を指定します。
これで、${変数名}で処理内に代入できます。

ビルド時に投入するクエリは、docker-entrypoint-initdb.dに入れておけば自動でデータベースに投入されます。

blog.websandbag.com

認証方式の変更は、パスワードを指定時にWITH mysql_native_passwordを指定します。
これらを組み合わせて、下記のような記述をします。

FROM mysql:8.0.16

COPY ./docker-entrypoint-initdb.d/ \
    ./docker-entrypoint-initdb.d/

ARG MYSQL_USER
ARG MYSQL_PASSWORD

RUN { \
    echo "ALTER USER '${MYSQL_USER}'@'%' IDENTIFIED WITH mysql_native_password BY '${MYSQL_PASSWORD}';"; \
} > ./docker-entrypoint-initdb.d/user_init.sql


以上です。
これで、docker-compose up時に初期データを投入した状態で起動します。
マイグレートもできるようになりますのでこれで解決できます。

©︎2017-2018 WebSandBag