Docker化SpringBoot连MySQL报Public Key Retrieval is not allowed
问题根因
这个报错的触发前提是MySQL 8.x及以上版本默认使用caching_sha2_password作为身份认证插件,客户端连接时如果未开启SSL,又不允许从服务端拉取公钥完成密码加密传输,就会抛出Public Key Retrieval is not allowed异常。
你已经在连接串里加了allowPublicKeyRetrieval=true却完全不生效,核心原因是你修改的连接配置根本没有被容器内运行的prod环境应用加载,和容器化本身、JDBC驱动版本没有直接关系。
从你的Dockerfile启动命令可以看到,容器内应用启动明确指定了-Dspring.profiles.active=prod,90%以上的同类问题都是开发者把修改后的连接串写在了dev环境配置文件(application-dev.yml/application-dev.properties)里,prod环境对应的配置文件里还是旧的、不带参数的连接串。这也正好解释了为什么非Docker环境运行正常:你本地启动默认用dev profile,加载的是修改过的dev配置,容器内强制切到prod profile,加载的是未修改的旧配置,参数自然不生效。
剩余小概率诱因包括:
- 配置格式错误:YAML配置里把URL参数的连接符
&错误转义成了&(这个转义只在.properties、XML配置格式里需要),导致参数无法被正确解析 - 配置优先级覆盖:你通过环境变量、JVM启动参数设置过数据库连接串,优先级高于配置文件,覆盖了你修改的内容
- 镜像构建缓存问题:Docker构建时复用了旧代码的中间层镜像,你最新修改的配置根本没有被打包进最终的应用Jar包
排查修复步骤
- 第一步:先确认应用实际加载的JDBC连接串
修改启动命令,加数据源配置的DEBUG日志,打印实际加载的连接参数:
启动后直接看日志里输出的实际JDBC URL,如果没有CMD java -jar -Dspring.profiles.active=prod -Dlogging.level.org.springframework.jdbc.datasource=DEBUG /usr/local/lib/app.jarallowPublicKeyRetrieval=true,可以100%确认是配置加载问题,顺着配置链路找覆盖的位置即可。 - 第二步:修正prod环境配置
把带参数的连接串写到prod环境对应的配置文件里,注意不同配置格式的写法差异:
如果是application-prod.properties格式:
如果是spring.datasource.url=jdbc:mysql://mysqldb:3306/BONANZA?allowPublicKeyRetrieval=true&useSSL=false&createDatabaseIfNotExist=true&autoReconnect=true&serverTimezone=Asia/Shanghaiapplication-prod.yml格式:
注意:YAML格式下不要把参数连接符spring: datasource: url: jdbc:mysql://mysqldb:3306/BONANZA?allowPublicKeyRetrieval=true&useSSL=false&createDatabaseIfNotExist=true&autoReconnect=true&serverTimezone=Asia/Shanghai&转义成&,转义后会被当成URL内容的一部分,导致参数完全失效 - 第三步:重新构建镜像,禁用构建缓存
避免Docker复用旧的构建层导致修改的配置没被打进Jar,构建时加--no-cache参数:docker build --no-cache -t bonanza-api .
可选的服务端永久修复方案
如果不想在连接串里加allowPublicKeyRetrieval=true参数,可以直接修改MySQL侧的用户认证规则,从根源规避这个报错:
- 进入MySQL容器登录数据库:
docker exec -it mysqldb mysql -uroot -p<你的MySQL root密码> - 执行SQL修改应用连接账号的认证插件:
ALTER USER '<你的应用数据库账号>'@'%' IDENTIFIED WITH mysql_native_password BY '<对应账号的密码>'; FLUSH PRIVILEGES;
修改后重启应用,就算连接串不带公钥检索参数也能正常连接。
内容的提问来源于stack exchange,提问作者Yousef Gamal
相关产品推荐
相关产品推荐

