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
相关产品推荐
相关产品推荐

