Docker部署的SpringBoot应用连接本地MySQL数据库时遭遇Access Denied问题求助
解决Docker容器中SpringBoot应用连接本地MySQL的Access Denied问题
先看你报错里的关键点:Access denied for user ' root'@'localhost'——注意用户名前面有个空格!这大概率是问题的核心,咱们一步步排查解决:
1. 修复环境变量的空格问题
你的docker-compose.yml里环境变量有两处致命的空格错误:
env.deploy =prod:=前后的空格会让变量值变成prod(前面带空格),SpringBoot读取到的profile是prod而非prod,自然不会加载application-prod.propertiesSPRING_DATASOURCE_USERNAME= root:这里的空格让用户名变成了root(前面带空格),MySQL里根本没有这个用户,肯定会拒绝访问
把docker-compose里的环境变量改成无空格的格式,同时去掉重复配置(你之前同时写了小写和大写变量,容易混淆):
environment: - env.deploy=prod - SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3306/magiccard?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false - SPRING_DATASOURCE_USERNAME=root - SPRING_DATASOURCE_PASSWORD=Root@123
2. 调整Dockerfile的构建逻辑
你的Dockerfile构建阶段用了mvn clean install -Dspring.profiles.active=local,这会让Maven构建时绑定local profile,但SpringBoot的profile应该是运行时指定的,构建阶段不需要绑定。改成不带profile参数的构建:
FROM maven:3.8.2-amazoncorretto-8 as builder WORKDIR /usr/app/magic-card COPY . . RUN mvn clean install # 去掉-Dspring.profiles.active=local From amazoncorretto:8-alpine-jre WORKDIR /usr/app/magic-card/service/ COPY --from=builder /usr/app/magic-card/target/MagicCard-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","app.jar"]
这样打包出来的jar是通用的,运行时通过环境变量指定profile即可。
3. 验证MySQL用户的授权有效性
虽然你已经授权了root@%,但还是要做以下确认:
- 执行
FLUSH PRIVILEGES;让授权立即生效 - 用本地终端测试远程连接:
mysql -h 192.168.0.101 -u root -pRoot@123,如果能成功连接,说明MySQL的网络访问正常 - 如果你的MySQL是8.0+版本,密码加密方式默认是
caching_sha2_password,部分旧JDBC驱动可能不支持,可把root用户的加密方式改成mysql_native_password:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123'; FLUSH PRIVILEGES;
4. 简化配置优先级,避免冲突
SpringBoot的外部环境变量优先级高于application-prod.properties里的配置,建议把application-prod.properties里的数据库连接信息去掉,完全用docker-compose的环境变量配置,这样更清晰:
application-prod.properties修改为:
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.generate-ddl=true
最后验证步骤
- 停止并删除旧容器:
docker-compose down - 重新构建镜像:
docker-compose build --no-cache - 启动容器:
docker-compose up - 查看容器日志,确认profile加载正确:日志里应该出现
The following profiles are active: prod的字样
这样调整后,应该就能解决Access Denied的问题了。
内容的提问来源于stack exchange,提问作者Vineel Pellella
相关产品推荐
相关产品推荐

