以前、LaravelのMySQL8.0はサポートしていないという記事を書きました。
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
に入れておけば自動でデータベースに投入されます。
認証方式の変更は、パスワードを指定時に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
時に初期データを投入した状態で起動します。
マイグレートもできるようになりますのでこれで解決できます。