Docker跨容器调用Django REST接口报ECONNREFUSED 0.0.0.0:8000错误求助
问题排查与解决方案
核心原因1:axios配置覆盖
你看到的请求0.0.0.0:8000的错误,大概率是axios实例的全局配置导致的:
- 检查
axiosInst初始化代码,是否设置了baseURL为http://0.0.0.0:8000,本地运行时这个地址指向你本机启动的Django服务可以正常访问,但容器内的0.0.0.0指向测试容器自身,自然会连接拒绝。 - 你贴出的测试代码里写死了
http://app:8000但完全没有用到函数传入的path参数,说明你实际运行的测试代码大概率没有写死完整域名,而是依赖全局baseURL+ 相对路径发起请求,所以才会用了错误的地址。 - 解决方法:容器环境下将axios的
baseURL修改为http://app:8000,或者每次请求都写完整的绝对路径。
核心原因2:服务启动顺序逻辑错误
docker-compose的depends_on只能保证容器的启动顺序,不会等Django服务完全就绪后再启动测试容器:
- Django启动时需要先执行迁移、加载数据,之后才会启动
runserver监听端口,测试容器启动过快时,Django还没开始监听8000端口,就会返回连接拒绝错误。 - 解决方法:给app服务添加健康检测,让测试容器等Django服务正常运行后再启动,修改docker-compose配置如下:
version: "3.8" services: test: build: ./cucumber_drf_tests image: cucumber_test container_name: cucumber_container # 测试服务不需要映射端口,可删除以下两行 # ports: # - 8001:8000 depends_on: app: condition: service_healthy app: build: . image: app:django container_name: django_rest_container ports: - 8000:8000 expose: - 8000 # 原卷挂载路径和Dockerfile内WORKDIR不匹配,要么调整为/app/src要么删除避免代码版本冲突 # volumes: # - .:/app/src command: > bash -c "python manage.py migrate && python manage.py loaddata ./project_apps/fixtures/dummy_data.json && python manage.py runserver 0.0.0.0:8000" healthcheck: test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:8000')\""] interval: 3s timeout: 10s retries: 5 depends_on: - db db: image: postgres container_name: postgres_db ports: - 5432:5432 volumes: - ./data/db:/var/lib/postgresql/data environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres
这里的健康检查用了Python自带的模块,不需要额外安装curl或者nc工具。
其他需要检查的配置
- 确认Django的
settings.py里ALLOWED_HOSTS配置包含app,或者临时设置为ALLOWED_HOSTS = ["*"]测试,避免Django直接拒绝来自测试容器的请求。 - 可以手动进入测试容器执行
curl http://app:8000验证网络连通性,如果可以访问说明是代码配置问题,如果不能访问再排查Docker网络配置。
内容的提问来源于stack exchange,提问作者htodev
相关产品推荐
相关产品推荐

