SpringBoot服务通过Docker Compose连接MySQL容器失败求助
Docker Compose部署SpringBoot连接MySQL容器失败:Access Denied报错
问题现象
使用Docker Compose部署SpringBoot服务(userjob)连接MySQL容器(dbmysql)时,出现数据库连接拒绝错误:
java.sql.SQLException: Access denied for user 'admin'@'172.18.0.10' (using password: YES)
已尝试修改端口(如3307),问题仍未解决。
配置文件与报错日志
docker-compose.yml
dbmysql: container_name: dbmysql image: mysql:latest restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: "password" MYSQL_USER: "admin" MYSQL_DATABASE: freelance ports: - "3306:3306" volumes: - /var/lib/docker/volumes/freelance_volume/_data userjob: depends_on: - dbmysql - eureka-server image: userjob:latest container_name: userjob build: context: userjob/. dockerfile: Dockerfile.layered #docker file path (. means current directory) ports: - "8000:8000" environment: - spring.datasource.url=jdbc:mysql://dbmysql:3306/freelance - spring.datasource.username=admin - spring.datasource.password="password" - log.level.root=debug
完整报错日志
java.sql.SQLException: Access denied for user 'admin'@'172.18.0.10' (using password: YES) 2023-02-22T17:36:09.797671197Z at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-j-8.0.31.jar:8.0.31] 2023-02-22T17:36:09.797672529Z at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.31.jar:8.0.31] 2023-02-22T17:36:09.797673778Z at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-j-8.0.31.jar:8.0.31] 2023-02-22T17:36:09.797674920Z at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-j-8.0.31.jar:8.0.31] 2023-02-22T17:36:09.797676415Z at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.0.31.jar:8.0.31] 2023-02-22T17:36:09.797677642Z at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-j-8.0.31.jar:8.0.31] 2023-02-22T17:36:09.797678805Z at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-5.0.1.jar:na] 2023-02-22T17:36:09.797679943Z at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) ~[HikariCP-5.0.1.jar:na] 2023-02-22T17:36:09.797681125Z at com.zaxxer.hikari.pool.PoolBase.
排查与解决方案
1. 补全MySQL用户密码环境变量
当前dbmysql的配置中缺少MYSQL_PASSWORD变量,这是创建admin用户时必须的参数,添加后才能正确设置用户密码:
dbmysql: # 其他配置不变 environment: MYSQL_ROOT_PASSWORD: "password" MYSQL_USER: "admin" MYSQL_PASSWORD: "password" # 新增该行 MYSQL_DATABASE: freelance
2. 修正SpringBoot密码配置的引号问题
环境变量中spring.datasource.password="password"的引号会被解析为密码的一部分,导致密码不匹配,直接去掉引号:
userjob: # 其他配置不变 environment: - spring.datasource.url=jdbc:mysql://dbmysql:3306/freelance?useSSL=false&serverTimezone=UTC - spring.datasource.username=admin - spring.datasource.password=password # 去掉引号 - log.level.root=debug
同时建议在JDBC URL中添加useSSL=false&serverTimezone=UTC,避免SSL和时区引发的额外问题。
3. 检查并修正MySQL用户连接权限
进入dbmysql容器,验证admin用户的连接权限:
docker exec -it dbmysql mysql -uroot -ppassword
在MySQL命令行执行:
SELECT user, host FROM mysql.user WHERE user='admin';
如果host值为localhost或127.0.0.1,说明该用户仅允许本地连接,需要修改为允许Docker子网连接:
GRANT ALL PRIVILEGES ON freelance.* TO 'admin'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
%表示允许任意IP连接,也可以指定为172.18.0.%限制连接范围。
4. 清理残留的Docker卷数据
如果之前创建过freelance_volume卷,可能存在旧的MySQL数据(比如错误的用户配置),删除卷后重新初始化:
docker-compose down -v docker-compose up -d
-v参数会删除关联的卷,确保MySQL容器重新创建时生成正确的用户和数据库。
5. 确保MySQL服务就绪后启动SpringBoot
depends_on仅保证容器启动顺序,无法确保MySQL服务已就绪。添加健康检查让SpringBoot等待MySQL可用:
dbmysql: # 其他配置不变 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uadmin", "-ppassword"] interval: 5s timeout: 5s retries: 5 userjob: depends_on: dbmysql: condition: service_healthy eureka-server: condition: service_started # 其他配置不变
内容的提问来源于stack exchange,提问作者Alex So
相关产品推荐
相关产品推荐

