Docker Compose部署Django Q报db主机名解析失败错误求助
问题原因
报错核心是Docker Compose内部DNS解析失败,直接诱因有两个:
- 你的
django-q服务配置中,depends_on字段仅声明了对redis的依赖,完全缺失db服务依赖项。Docker Compose默认会并行启动无依赖关系的服务,django-q启动时db容器还未完成初始化,没有在Compose内置DNS服务中注册db对应的域名记录,自然无法解析主机名。 - 你当前配置里的
depends_on仅控制容器启动顺序,不会校验被依赖服务是否真正可用,就算补全依赖,数据库初始化慢的时候仍可能出现连接异常。
对比你的web服务就可以验证:web服务的depends_on包含db,Compose会优先启动db再拉起web,因此web服务不会触发同类解析错误。
修复步骤
1. 补全django-q服务的依赖配置
修改docker-compose.yml中django-q服务的depends_on段,新增db依赖:
django-q: build: . command: python manage.py qcluster volumes: - .:/ps_survey env_file: - ./.env.prod depends_on: - redis - db # 新增该行
2. (可选但推荐)添加服务健康检查,避免时序问题
仅补全依赖只能解决DNS解析问题,无法覆盖PostgreSQL启动慢、初始化未完成导致的连接失败。建议给db服务添加健康检查,让依赖服务等数据库完全就绪后再启动:
首先修改db服务配置,新增健康检查规则:
db: image: postgres:12.8-alpine restart: always volumes: - postgres_data:/var/lib/postgresql/data/ env_file: - ./.env.prod.db ports: - 5400:5432 healthcheck: # 新增段 test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 5
然后将web和django-q的依赖规则改为等待服务健康:
# web服务depends_on修改示例 depends_on: redis: condition: service_started db: condition: service_healthy # django-q服务depends_on修改示例 depends_on: redis: condition: service_started db: condition: service_healthy
3. 重启服务生效
执行以下命令重建并启动所有服务:
docker compose down docker compose up -d --build
启动后执行docker compose logs django-q查看日志,确认无域名解析报错即可。
内容的提问来源于stack exchange,提问作者Shovarnu Dutta
相关产品推荐
相关产品推荐

