Docker部署Spring Boot启动成功但API调用报socket hang up错误
核心问题
你的配置存在多处逻辑冲突,直接导致服务无法正常访问:
- docker-compose.yml同层级重复定义
image字段,YAML语法下同key会取最后一个值,你写的build构建逻辑完全失效:compose不会执行你写的Dockerfile生成可执行jar镜像,而是直接拉取tomcat:9.0-jdk8原生镜像启动,容器里根本没有你打包的业务应用 - 端口映射和服务监听端口不匹配:你配置的端口映射是
8089:8080(宿主机8089端口转发到容器内8080端口),但从日志看你的SpringBoot内置Tomcat实际监听容器内8089端口,转发到8080的请求没有对应服务处理,连接直接被断开就会触发socket hang up错误 - 运行模式配置混乱:你既写了基于openjdk直接跑可执行jar的Dockerfile,又在compose里配置了独立tomcat镜像的挂载目录、JAVA_OPTS参数,两套运行逻辑混写,大部分配置都是无效的。另外你配置的
db.host=localhost也有问题:容器内localhost指向容器自身,后续接口连接PostgreSQL会直接失败。
修复方案
选择一种运行模式调整配置即可,推荐用更简单的内置Tomcat跑jar的模式:
1. 修改docker-compose.yml
删除重复的image配置、无效的tomcat挂载配置,调整端口映射匹配应用监听端口:
version: '3.3' services: web: build: context: . dockerfile: Dockerfile ports: # 宿主机8089转发到容器内应用实际监听的8089端口 - '8089:8089' environment: # 注意将db.host替换为PostgreSQL实际可访问的IP,不要填localhost - JAVA_OPTS=-Ddb.host=数据库实际访问地址 -Ddb.catalog=gohybridit_dev -Ddb.port=5432 -Ddb.username=postgres -Ddb.password=123
2. 修改Dockerfile
调整启动命令确保JAVA_OPTS环境变量可以正常生效:
FROM openjdk:8-jdk-alpine WORKDIR /opt/app ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
3. 重启验证
执行命令清理旧的无效容器和镜像,重新启动服务:
docker-compose down docker image prune -f docker-compose up --build
启动后确认日志中Tomcat监听8089端口,再通过Postman访问对应接口即可正常连通。
如果你要选择独立Tomcat部署war包的模式,需要把项目打包为war包,重写Dockerfile基于tomcat:9.0-jdk8镜像构建,将war包复制到webapps目录下,同时保留compose中对应的tomcat配置,端口映射调整为和容器内tomcat监听端口一致即可。
内容的提问来源于stack exchange,提问作者Alaa Ebeed
相关产品推荐
相关产品推荐

