deezus blog

.Net Core、Typescriptを中心に技術的ノウハウを公開しています

DockerでMySQL8を使う場合、パスワード認証をmysql_native_passwordにする方法

Node.jsでMySQLに接続できない

MySQL8はパスワードでの認証方法(caching_sha2_password)が5.7以前(mysql_native_password)と変わりました
そのため対応するドライバでない場合、うまく認証ができずMySQLに接続できません
例えばNode.jsでmysqlを使用して接続する場合下記のようなエラーが発生します

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

これはmysqlパッケージがcaching_sha2_passwordに対応していないためです

対策

パッケージが対応するのを待つべきかもしれませんが、暫定対応として認証方式をmysql_native_passwordに変更します
docker-composeを使用する場合の例です

db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
command: --default-authentication-plugin=mysql_native_password

で認証方式をmysql_native_passwordに変更しています