配置Spring Boot连接Docker化MySQL遇权限拒绝问题排查
问题
启动Spring Boot项目时反复出现以下异常:
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
我的application.properties配置:
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=MyPassword
docker-compose.yml配置:
# Use root/example as user/password credentials version: '3.1' services: db: image: mysql:8.0 # NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password # (this is just an example, not intended to be a production configuration) command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: MyPassword adminer: image: adminer restart: always ports: - 8080:8080
我能通过Adminer用上述凭据成功连接数据库,执行查询:
SELECT user, plugin FROM mysql.user;
得到结果:
| user | plugin +---------+----------------------- | root | mysql_native_password
数据库和Adminer通过docker-compose启动,Spring Boot项目未容器化,单独在宿主机启动,请问连接配置哪里有问题?
环境信息:
org.springframework.boot -> 3.0 OS -> Ubuntu 22.04 Dockerized MySql -> 8.0
问题分析与解决
1. 缺少MySQL容器端口映射
你的docker-compose.yml中,db服务没有将容器的3306端口映射到宿主机,导致宿主机上的Spring Boot无法访问容器内的MySQL服务。Adminer能正常连接是因为它和MySQL容器处于同一个Docker网络中,可以直接通过服务名db访问,而宿主机无法直接访问容器内部端口。
解决方法:在db服务中添加端口映射配置:
db: image: mysql:8.0 command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: MyPassword ports: - "3306:3306" # 添加这一行
修改后重启docker-compose:
docker-compose down && docker-compose up -d
2. MySQL root用户访问权限限制
MySQL的root用户默认仅允许从容器内部的localhost访问,宿主机访问时的身份是root@宿主机IP,会被权限规则拒绝。需要授权root用户允许从任意地址访问:
- 进入MySQL容器:
docker-compose exec db mysql -uroot -pMyPassword
- 执行授权命令:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'MyPassword' WITH GRANT OPTION; FLUSH PRIVILEGES;
3. Spring Boot数据库连接URL优化
Spring Boot 3.0搭配MySQL 8.0时,建议在URL中添加必要的参数,避免时区、SSL及公钥检索相关的潜在问题:
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
内容的提问来源于stack exchange,提问作者0xC0DEGURU
相关产品推荐
相关产品推荐

