You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.properties
  • SPRING_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

最后验证步骤

  1. 停止并删除旧容器:docker-compose down
  2. 重新构建镜像:docker-compose build --no-cache
  3. 启动容器:docker-compose up
  4. 查看容器日志,确认profile加载正确:日志里应该出现The following profiles are active: prod的字样

这样调整后,应该就能解决Access Denied的问题了。

内容的提问来源于stack exchange,提问作者Vineel Pellella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:17:35