无法登录到docker中的mysql容器
无法登录到docker中的mysql容器
我正在尝试设置一个包含1个node.js服务器和1个mysql数据库的应用程序,并尝试将其与docker集成。我在尝试从我的node.js应用程序登录到mysql时遇到了问题。简而言之 - 这是我的docker-compose.yml文件:
版本:'2.1'
服务:
db:
构建:./db
重启:always
环境:
#- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_DATABASE=subscriptions
- MYSQL_PASSWORD=supersecretpassword
- MYSQL_ROOT_PASSWORD=supersecretpassword
- MYSQL_USER=root
健康检查:
测试:["CMD", "mysqladmin","ping","-h","localhost"]
间隔:30秒
超时:1秒
重试次数:1
subscription_api:
构建:./subscription_api_server
重启:always
依赖项:
db:
条件:service_healthy
端口:
- "5000:5000"
我的MySQL的Dockerfile:
CREATE DATABASE IF NOT EXISTS subscriptions;
授予root@localhost的所有特权的密码为'supersecretpassword'的所有特权;
刷新权限;
我的node.js应用程序使用sequelize作为ORM,连接字符串在这里指定config.js
"development":{
"username":"root",
"password":"supersecretpassword",
"database":"subscriptions",
"host":"db",
"dialect":"mysql"
},
当我运行docker-compose up时,我从我的node.js应用程序得到以下错误:
subscription_api_1 | Sequelize CLI [Node:10.12.0,CLI:5.1.0,ORM:4.39.0]
subscription_api_1 |
subscription_api_1 | 加载配置文件“config / config.json”。
subscription_api_1 | 使用环境“development”。
subscription_api_1 | 2018年10月14日星期日GMT 17:50:17 sequelize已弃用基于字符串的运算符,现在不再推荐使用。请使用基于符号的运算符以获得更好的安全性,请参阅http://docs.sequelizejs.com/manual/tutorial/querying.html#operators的node_modules/sequelize/lib/sequelize.js:242:13
subscription_api_1 |
subscription_api_1 | 错误:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端
但是当我尝试直接通过ssh登录到我的docker容器时,用户名/密码有效:
sudo docker exec -it fullstack-dev-assignment_db_1 bash
root@d36f499b706e:/# mysql -u root -p
输入密码:
错误1045(28000):用户'root'@'localhost'的访问被拒绝(使用密码:YES)
root@d36f499b706e:/# mysql -u root -p
输入密码:
欢迎使用MySQL监视器。命令以;或\ g结束。
我在设置sequelize时做错了吗?
无法登录到Docker中的MySQL容器
问题出现的原因是MySQL 8.0现在使用的默认身份验证插件与sequelize
使用的社区Node.js驱动程序不兼容。
要解决这个问题,可以按照这里描述的步骤进行操作。
在你的情况下,除了授予权限之外,还需要先切换用户的身份验证插件。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'supersecretpassword'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;