执行docker-compose up出现django no port[s] to connect to错误如何解决?
问题排查解决方案
1. 核心问题:服务启动顺序不同步
Docker Compose的depends_on仅保证容器启动顺序,不等待容器内服务完全就绪。你当前配置中,Django容器启动后需要先执行entrypoint.sh内的PostgreSQL等待、静态资源收集、数据库迁移、超级用户创建等操作,全部执行完成后才会启动gunicorn监听8000端口。但React和Nginx会在Django容器刚启动时就开始启动,此时Django端口未开放,就会抛出连接失败错误。
修复方案:给Django服务添加健康检查,等待端口就绪后再启动下游服务,修改docker-compose.yml的django配置块:
django: build: context: ./backend dockerfile: Dockerfile volumes: - django_static_volume:/usr/src/app/static expose: - 8000 env_file: - ./backend/.env command: gunicorn candle.wsgi:application --bind 0.0.0.0:8000 depends_on: - db # 新增健康检查 healthcheck: test: ["CMD", "nc", "-z", "localhost", "8000"] interval: 2s timeout: 5s retries: 30
再修改react服务的depends_on配置:
react: # 其他配置不变 depends_on: django: condition: service_healthy
2. 检查Django配置项
- 确认
settings.py中的ALLOWED_HOSTS包含django(Docker Compose内部服务域名),测试阶段可先设置为ALLOWED_HOSTS = ["*"]验证问题 - 确认gunicorn启动命令中的wsgi路径正确:你的命令为
gunicorn candle.wsgi:application,需确认Django项目根目录下存在candle/wsgi.py文件,路径错误会导致gunicorn启动失败,端口无法监听
3. 检查entrypoint.sh执行异常
单独启动Django容器查看运行日志,排查执行过程中是否报错:
docker-compose up django
常见错误点:
- 数据库环境变量配置错误,导致PostgreSQL连接超时,
entrypoint.sh卡在等待数据库的步骤 - 超级用户创建逻辑报错(比如环境变量缺失、用户名格式不符合要求),导致脚本终止,无法执行后续的gunicorn启动命令
4. 前端Dockerfile缺失多阶段构建声明
你贴出的前端Dockerfile没有声明构建阶段,开头缺失基础镜像和builder别名声明,会导致前端构建失败,最终报错可能被误判为Django连接异常,补充开头配置:
# 补充开头的构建阶段声明 FROM node:16-alpine as builder WORKDIR /usr/src/app # 后面是你原有的COPY、RUN等逻辑 COPY ./react_app/package.json . RUN apk add --no-cache --virtual .gyp \ python \ make \ g++ \ && npm install \ && apk del .gyp COPY ./react_app . ARG API_SERVER ENV REACT_APP_API_SERVER=${API_SERVER} RUN REACT_APP_API_SERVER=${API_SERVER} \ npm run build WORKDIR /usr/src/app RUN npm install -g serve COPY --from=builder /usr/src/app/build ./build
5. 端口监听验证
Django容器启动后,执行以下命令进入容器,确认8000端口是否正常监听:
docker exec -it <你的Django容器名> bash ss -tulpn | grep 8000
如果没有输出,说明gunicorn未正常启动,查看gunicorn运行日志定位问题。
内容的提问来源于stack exchange,提问作者Andrew Bregman
相关产品推荐
相关产品推荐

