You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中Django服务与Listener服务通信异常求助

排查Listener服务向App服务POST请求未写入数据库的问题

以下是针对该问题的分步排查方案:

1. 修正容器内部请求地址

Docker Compose服务间通信不能使用0.0.0.0:8000,容器内部需通过服务名访问其他服务。将Listener服务中的请求目标地址改为http://app:8000(替换为你的具体API路径),app是Docker Compose为该服务分配的内部主机名。

2. 确保App服务就绪后再启动Listener

depends_on仅保证启动顺序,不确保App服务完全就绪(如数据库连接建立、Web服务启动完成)。可通过以下方式优化:

  • 在App服务的runserver.sh中添加健康检查逻辑,或在Dockerfile里配置HEALTHCHECK指令;
  • 在Listener的启动脚本中加入延迟重试,比如用wait-for-it工具等待app:8000端口就绪后,再执行npm run listen。

3. 验证App服务的数据库连接配置

确认App服务的数据库连接地址为db:5432(而非localhost:5432),检查./docker/env.db中的POSTGRES_HOST是否设置为db——容器内部只能通过服务名访问PostgreSQL服务。

4. 查看服务日志定位错误

执行以下命令查看各服务日志:

  • App服务日志(检查请求接收、数据库操作错误):
    docker-compose logs app
    
  • Listener服务日志(检查请求发送状态、响应错误):
    docker-compose logs listener
    
  • PostgreSQL服务日志(检查连接请求、权限问题):
    docker-compose logs db
    

5. 直接验证API功能

从宿主机调用App的API,确认API本身能正常写入数据:

curl -X POST http://localhost:8000/你的API路径 -d "测试数据"

如果宿主机调用成功,问题集中在Listener的请求配置或容器间网络;如果失败,排查App的API逻辑或数据库连接。

6. 检查容器间网络连通性

进入Listener容器,测试与App服务的网络连通性:

docker-compose exec listener ping app

如果ping不通,检查是否有自定义网络配置冲突,或容器是否正常运行。

你的Docker Compose配置

services:
  db:
    image: postgres:13.4
    env_file:
      - ./docker/env.db
    ports:
      - 5432:5432
    volumes:
      - db_data:/var/lib/postgresql/data

  app:
    build:
      context: .
      dockerfile: ./docker/Dockerfile
    env_file:
      - ./docker/env.db
      - ./.env
    volumes:
      - .:/opt/code
    ports:
      - 8000:8000
      - 3000:3000
    depends_on:
      - db
    command: bash ./scripts/runserver.sh

  listener:
    image: scooprank_app
    env_file:
      - ./.env
    container_name: listener
    command: npm run listen
    depends_on:
      - app
    restart: always

内容的提问来源于stack exchange,提问作者Nabeel Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:26:20