Spring Boot OAuth2授权服务容器在Docker Compose中无法连接Redis,报错'Failed to connect to localhost:6379'
我完全懂你现在的头疼——明明Docker Compose里把Redis容器名设为了authorization-server-db,环境变量也传了,配置文件也引用了变量,结果授权服务启动时还是死磕localhost:6379,连Redis容器的边都碰不到。咱们一步步拆解问题,找到根因解决它。
先排查最可能的核心问题:配置未正确生效
从你的错误日志和配置来看,最大概率是Redis的host配置没有被Spring Boot正确读取,导致它 fallback 到了默认的localhost。咱们从这几个方向验证:
1. 确认Docker环境变量是否真的传到了容器里
先进入授权服务容器,检查环境变量是否正确:
# 进入授权服务容器 docker exec -it authorization-server sh # 查看Redis host环境变量 echo $SPRING_DATA_REDIS_HOST
如果输出不是authorization-server-db,那Docker Compose的环境变量配置有问题:
- 检查变量名拼写:比如是不是把
SPRING_DATA_REDIS_HOST写成了SPRING_REDIS_HOST(少了DATA); - 换一种环境变量定义格式:把Docker Compose里的环境变量改成数组形式,避免格式解析问题:
environment: - SPRING_PROFILES_ACTIVE=docker - SPRING_DATA_REDIS_HOST=authorization-server-db - SPRING_DATA_REDIS_PORT=6379
2. 检查Redis配置项的前缀是否正确
Spring Boot不同版本/不同starter的Redis配置前缀可能有差异:
- 如果你用的是
spring-boot-starter-data-redis,配置项前缀是spring.data.redis.*,你的配置是对的; - 但如果是旧版的
spring-boot-starter-redis(现已弃用),前缀是spring.redis.*。
你可以临时修改application-docker.properties,直接硬编码测试(排除变量解析问题):
# 先不用变量,直接写死容器名 spring.data.redis.host=authorization-server-db spring.data.redis.port=6379
重新构建镜像启动,如果这时候能正常连接Redis,说明之前的环境变量解析有问题;如果还是连localhost,那大概率是配置文件没被正确加载。
3. 确认application-docker.properties是否被正确打包
检查你的构建脚本(Maven/Gradle),确保application-docker.properties被包含到了最终的jar包中:
- Maven:检查
pom.xml的resources插件配置,有没有排除这个文件; - Gradle:检查
sourceSets配置,确保src/main/resources下的所有配置文件都被打包。
另外,从你的日志里看到The following 1 profile is active: "docker",说明profile是正确激活的,但如果配置文件没打包进去,Spring Boot会用默认的application.properties(dev环境)里的Redis配置——而dev环境你可能没改,默认就是localhost,这就会导致问题!
4. 验证容器网络连通性
虽然你的Docker Compose已经把两个容器放到了同一个oauth2-network网络里,但还是可以验证一下连通性:
# 进入授权服务容器,ping Redis容器 docker exec -it authorization-server ping authorization-server-db
如果ping不通,说明网络配置有问题——检查Docker Compose的networks配置,确保两个服务都指定了oauth2-network。
其他可能的小细节
- 如果你用的是Spring Boot 3.x的AOT编译,有没有可能AOT处理时把配置硬编码了?可以尝试关闭AOT编译(去掉
spring.aot.enabled=true)重新构建测试; - Redis容器的健康检查用的是
redis-cli ping,这个没问题,但可以确认Redis容器启动后是否真的能响应:进入Redis容器执行redis-cli ping,看是否返回PONG。
按照上面的步骤排查,基本能定位到问题所在——大概率是配置文件加载或环境变量解析的问题,调整后应该就能正常连接Redis了。
内容来源于stack exchange

