Docker-Compose部署Django+PostgreSQL遇POST请求连接拒绝问题求助
解决思路
1. 修复数据库名称不匹配问题
你的docker-compose中PostgreSQL初始化的数据库名是project,但settings.py里Django配置的数据库名是assignment,两者不一致会导致Django无法连接到正确的数据库,可能造成服务看似启动但实际未就绪:
- 方案一:修改docker-compose.yml中db服务的
POSTGRES_DB为assignment:environment: POSTGRES_PASSWORD: verySecretPassword POSTGRES_USER: administrator POSTGRES_DB: assignment - 方案二:修改settings.py中的数据库NAME为
project:DATABASES = { 'default': { ... 'NAME': 'project', ... } }
修改后重新部署:docker-compose down -v && docker-compose up --build
2. 修正测试请求的目标地址
错误中显示测试代码尝试连接172.17.0.1:8080,需根据测试运行环境调整地址:
- 如果测试在web容器内部执行(比如在容器里跑pytest):将请求地址改为
http://localhost:8080,容器内部可直接访问自身服务。 - 如果测试在宿主机执行:改用
http://localhost:8080(替代172.17.0.1),Docker已将容器8080端口映射到宿主机,localhost即可访问。若在Windows/Mac环境,也可使用http://host.docker.internal:8080。
3. 优化服务启动顺序(替代sleep)
当前用sleep 10等待数据库启动,可靠性低。改用Docker健康检查确保数据库完全就绪后再启动Django:
在docker-compose.yml的db服务中添加健康检查,web服务依赖db的健康状态:
services: db: image: postgres:latest restart: always environment: POSTGRES_PASSWORD: verySecretPassword POSTGRES_USER: administrator POSTGRES_DB: assignment # 对应修改后的数据库名 volumes: - ./data/db:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U administrator -d assignment"] interval: 5s timeout: 5s retries: 5 web: build: . restart: always ports: - "8080:8080" depends_on: db: condition: service_healthy environment: DATABASE_URL: postgresql://administrator:verySecretPassword@db:5432/assignment volumes: - .:/app
同时删除Dockerfile CMD中的sleep 10:
CMD ["bash", "-c", "python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8080"]
4. 验证服务状态
部署完成后:
- 用
docker-compose logs web查看Django启动日志,确认无数据库连接错误。 - 在宿主机执行
curl http://localhost:8080,验证服务是否正常响应。
内容的提问来源于stack exchange,提问作者Carlos Gomez
相关产品推荐
相关产品推荐

