Go JSON-RPC服务器Docker-Compose运行报错curl(52)空回复求助
JSON-RPC容器化后无响应问题解决
核心问题
你的配置存在端口不匹配和本地代码卷挂载覆盖程序两个关键问题,导致容器内服务无法被外部正常访问。
具体修复步骤
1. 统一端口配置
docker-compose中设置的RPC_ADDR=:9001,意味着程序在容器内监听9001端口,但端口映射却是9001:9000(宿主机9001映射到容器9000),两边端口完全不匹配,自然拿不到响应。
修改docker-compose里的环境变量,让程序监听容器内的9000端口,和Dockerfile的EXPOSE、端口映射保持一致:
environment: - RPC_ADDR=:9000 # 改成与容器侧映射端口一致 - HTTP_ADDR=:8001 - PG_PORT=5432 - PG_HOST=postgres-db
如果需要访问HTTP服务,记得在ports里补充对应映射:
ports: - "9001:9000" - "8001:8001" # 新增HTTP端口映射(按需添加)
2. 移除本地代码卷挂载
你配置了volumes: - .:/app,会把本地项目目录直接覆盖到容器的/app目录,导致容器运行的是本地未编译的代码,而非Dockerfile中编译好的/app可执行文件,极易出现依赖缺失或运行异常。如果不需要热重载代码,直接删除这个volumes配置。
3. 确认程序监听地址
确保Go代码里没有硬绑定127.0.0.1,必须监听0.0.0.0:端口或者简写为:端口(后者等价于监听所有网卡)。如果绑定了localhost,容器内的服务仅能自身访问,外部(包括宿主机)根本无法连接。
4. 验证服务状态
- 查看容器日志确认服务是否正常启动:
docker logs rpc-app_v1.0 - 若distroless镜像支持,进入容器检查监听端口:
docker exec -it rpc-app_v1.0 ss -tulpn
修改后的完整docker-compose示例
version: "3" services: app: build: . container_name: "rpc-app_v1.0" ports: - "9001:9000" - "8001:8001" restart: on-failure environment: - RPC_ADDR=:9000 - HTTP_ADDR=:8001 - PG_PORT=5432 - PG_HOST=postgres-db depends_on: - postgres-db networks: - back postgres-db: image: postgres:latest container_name: "rpc-app-db_v1.0" ports: - "5435:5432" environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=qwerty - POSTGRES_DB=postgres - POSTGRES_HOST=postgres-db networks: - back networks: back: driver: bridge
内容的提问来源于stack exchange,提问作者Rustam Khusainov
相关产品推荐
相关产品推荐

