Spring Boot容器无法连接Redis:已配置redis主机却仍连localhost求助
从日志来看,Spring Boot应用始终尝试连接localhost:6379,说明你配置的spring.redis.host=redis没有被正确加载或生效。结合docker-compose的配置,可能的原因包括:配置加载优先级冲突、容器内配置文件未正确读取、Docker挂载导致的配置覆盖。
1. 验证容器内的环境变量与配置
首先进入Spring Boot容器,检查环境变量和实际加载的配置:
# 替换成你的app容器ID或名称 docker exec -it <app-container-name> bash # 查看环境变量是否正确设置 echo $SPRING_REDIS_HOST
如果输出不是redis,说明docker-compose里的环境变量没有被正确注入,检查docker-compose.yml的缩进和语法(比如环境变量的横线是否正确)。
如果环境变量正确,但应用还是连localhost,说明存在更高优先级的配置覆盖了它。可以启用Spring Boot的Actuator端点来查看所有配置源:
- 在pom.xml中添加Actuator依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
- 在application.properties中开启端点:
management.endpoints.web.exposure.include=env
重启应用后访问http://localhost:8080/actuator/env,搜索spring.redis.host,查看它的配置来源,确认是否有其他配置(比如命令行参数、bootstrap.properties)覆盖了你的设置。
2. 修正Dockerfile与挂载配置
你的docker-compose中挂载了.:/app,这会将本地目录覆盖容器内的/app目录。如果你的Dockerfile是基于本地目录构建的,可能导致容器内的应用读取的是本地的旧配置,或者jar包未正确打包。
优化Dockerfile示例
确保Dockerfile正确打包Spring Boot应用:
FROM openjdk:17-jdk-slim WORKDIR /app # 复制打包好的jar包到容器内 COPY target/your-project-name.jar app.jar # 启动应用 ENTRYPOINT ["java", "-jar", "app.jar"]
然后去掉docker-compose中volumes里的.:/app,避免本地目录覆盖容器内的应用文件,让镜像自带的配置生效。
3. 确认网络连通性(排除网络问题)
如果上述步骤都没问题,检查容器间的网络连通性:
# 在app容器内ping redis服务 docker exec -it <app-container-name> ping redis
如果能ping通,说明网络正常,问题还是出在配置加载上;如果ping不通,检查docker-compose的network配置,确保所有服务都在同一个app-network下(你的配置已经正确设置了这一点,大概率没问题)。
4. 检查Redis配置(确保Redis允许外部连接)
你的redis.conf已经设置了bind 0.0.0.0和protected-mode no,这部分是正确的,Redis容器应该能接受来自app容器的连接,这一步可以作为最后验证。
最可能的问题是配置未被正确加载,优先检查容器内的环境变量和配置来源,其次排查Docker挂载导致的配置覆盖问题。
内容的提问来源于stack exchange,提问作者udd_ish

