Docker Compose部署Django应用无法解析db数据库服务名报错如何解决
问题原因
depends_on仅控制容器启动顺序,不会等待PostgreSQL服务完成初始化、网络配置就绪再启动web容器,web启动时db服务还未接入网络,导致主机名解析失败- PyCharm运行Docker Compose时的配置问题:默认可能仅单独启动web容器,未将web容器加入db所在的网络,也未关联启动db服务
- 自定义的
badger-postgres镜像启动异常,db容器退出,导致网络中不存在db这个服务名 - 旧版本Docker Compose会给自定义网络添加项目名前缀,导致服务名解析规则失效
解决步骤
- 先确认db容器运行状态
执行命令docker compose ps查看db容器状态,如果为Exit状态,执行docker compose logs db查看镜像启动日志,排查是否存在数据库初始化失败、端口被占用等基础问题。 - 增加数据库启动等待逻辑
修改docker-compose.yml中web服务的启动命令,等待db端口连通后再启动Django服务:
services: web: image: "badger-dev" ports: - "8000:8000" volumes: - .:/app depends_on: - db command: > sh -c " while ! nc -z db 5432; do sleep 1; done; python manage.py runserver 0.0.0.0:8000"
如果web镜像为Alpine基础镜像,将nc -z db 5432改为nc -w1 db 5432即可。
3. 修正PyCharm运行配置
打开PyCharm的运行/调试配置面板,找到对应的Docker Compose运行项:
- 确认启动的服务列表中同时勾选了
web和db,不要仅勾选web - 确认选项中没有开启「跳过启动关联服务」类配置
- 不要直接在PyCharm本地终端执行Django启动命令,本地环境无法解析Docker内部的
db服务名,必须通过Docker Compose启动完整服务栈
- 显式指定网络别名
在db服务配置中添加网络别名,强制服务可以通过db域名访问:
db: image: "badger-postgres" container_name: db ports: - "5432:5432" networks: djangonetwork: aliases: - db
- 重建容器与网络
执行命令清理旧的容器、网络资源后重新启动:
docker compose down -v docker compose up --build
内容的提问来源于stack exchange,提问作者Antonio Gamiz Delgado
相关产品推荐
相关产品推荐

