Spring Boot容器化后无法连接Amazon RDS Aurora MySQL问题求解
问题根因
你配置的useSSL=false参数未实际生效,导致MySQL驱动仍尝试发起SSL连接,而Docker内置的OpenJDK 8镜像默认禁用了TLSv1、TLSv1.1等旧版协议,与Aurora MySQL的SSL协议版本不匹配,触发SSL握手失败。本地直接运行正常是因为本地运行环境的JDK安全配置、配置文件解析规则和容器内环境存在差异。
修复方案
1. 修正JDBC URL参数分隔符
application.properties文件中不需要对&做HTML转义,你当前写的&会导致useSSL=false参数无法被驱动识别,直接修改配置:
spring.datasource.url=jdbc:mysql://aws_rds:3306/service_db?serverTimeZone=UTC&useSSL=false
如果生产环境需要开启SSL保证安全,可以不用关闭SSL,额外新增指定TLS版本的参数即可:
spring.datasource.url=jdbc:mysql://aws_rds:3306/service_db?serverTimeZone=UTC&useSSL=true&enabledTLSProtocols=TLSv1.2
2. 调整容器内JDK安全配置(可选,开启SSL时需要)
如果你的Aurora MySQL实例仅支持旧版TLS协议,可以在Dockerfile中添加配置修改指令,放开JDK对旧TLS版本的禁用:
FROM openjdk:8 ARG app_name ENV version / ENV build / # 新增这一行,移除TLSv1、TLSv1.1的禁用规则 RUN sed -i 's/jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1/jdk.tls.disabledAlgorithms=SSLv3/g' $JAVA_HOME/jre/lib/security/java.security COPY ./target/${app_name}.jar ./app.jar # 修正CMD的环境变量解析问题,使用sh执行才能识别${}占位符 CMD ["sh", "-c", "java -Dserver.port=80 -Dproject.version=${version} -Dbuild.number=${build} -jar ./app.jar"]
3. 修复Dockerfile环境变量解析问题
你当前使用的exec模式CMD不会触发shell解析,${version}和${build}占位符无法被替换为实际的环境变量值,按上面的Dockerfile示例修改为sh -c包裹的形式即可。
内容的提问来源于stack exchange,提问作者Tomash Gombosh
相关产品推荐
相关产品推荐

