Spring Boot Docker容器向Solr Docker容器添加文档失败排查
1. Solr服务未在Spring Boot启动前就绪
直接通过docker run启动两个容器时,Solr启动需要加载内核、初始化服务,耗时比Spring Boot长。如果Spring Boot在Solr完全就绪前就尝试初始化SolrClient或调用相关方法,可能导致连接失败,甚至服务初始化异常,后续业务代码根本没执行到,自然看不到日志。
验证方法:先启动Solr容器,等待5-10分钟(或通过docker logs solr-container查看日志,确认出现Started Solr server on port 8983类的就绪提示),再启动Spring Boot容器,测试功能是否正常。
2. Solr容器中缺少目标Core "gendoi"
本地运行时你可能已经手动创建了gendoi Core,但默认启动的Solr容器没有这个Core。如果SolrClient初始化时依赖该Core,或者调用add方法时指定了不存在的Core,会导致异常,但如果异常发生在日志输出之前,就看不到你写的打印信息。
解决方法:启动Solr容器时自动创建Core,修改启动命令:
docker run --name solr-container --network mynetwork -d -p 8983:8983 solr solr-create -c gendoi
3. Spring Boot容器日志未正确输出
容器化环境下,Spring Boot的日志配置可能未将System.out的输出定向到容器标准输出,导致你看不到自定义的打印日志。此时代码可能正常执行或抛出异常,但日志被写入了容器内的文件而非控制台。
验证方法:执行docker logs spring-app查看容器的完整日志,检查是否有Solr相关的异常信息或初始化日志。
4. 网络连通性异常(同一网络下的隐性问题)
虽然两个容器在同一网络,但可能存在DNS解析失败或端口未开放的情况:
- 进入Spring Boot容器,测试网络连通性:
docker exec -it spring-app ping solr-container docker exec -it spring-app curl http://solr-container:8983/solr/ - 检查两个容器是否确实在同一网络:
docker inspect solr-container | grep -A5 Networks docker inspect spring-app | grep -A5 Networks
5. Spring Boot配置未正确加载
容器化时,可能存在配置文件未打包到镜像、或环境变量覆盖了配置的情况,导致Solr地址配置错误。
验证方法:进入Spring Boot容器,查看配置文件内容:
docker exec -it spring-app cat /app/application.properties # 路径根据你的镜像结构调整
确认spring.data.solr.host=http://solr-container:8983/solr/配置存在且正确。
内容的提问来源于stack exchange,提问作者Syed Faraz Hasan

