Windows下Docker部署Django时出现db主机名临时解析失败报错
该问题解决方案
该报错核心原因是Windows环境下Docker网络DNS注册延迟,或是db容器未完全就绪就启动web容器导致,同时你的配置存在2处可修正的问题,按以下步骤操作即可解决:
- 首先修正
docker-compose.yml中postgres服务的环境变量错误:将POSTGRES_DATABASE: admin改为POSTGRES_DB: admin,postgres官方默认的自动创建数据库的环境变量为POSTGRES_DB,你写错后会导致默认库未创建,也是潜在故障点。 - 删除
web服务下的links: - db:db配置,新版docker-compose中同一自定义网络的服务天然可以通过服务名互通,冗余的links配置在Windows Docker环境下容易触发网络解析冲突。 - 给web服务增加启动等待逻辑,
depends_on仅保证容器启动顺序,不保证postgres进程完全就绪、网络注册完成,你可以直接修改web服务的启动命令:
services: web: # 保留原有其他配置不变,仅替换command字段为以下内容 command: sh -c "python -c 'import socket, time; while True: try: s = socket.create_connection((\"db\", 5432)); s.close(); break; except Exception: time.sleep(1)' && gunicorn --bind 0.0.0.0:8000 app.wsgi:application -k eventlet"
- 执行以下命令清理原有Docker资源:
# 停止并删除现有容器、网络,如dbdata有重要数据请去掉-v参数 docker-compose down -v # 清理无用Docker网络缓存 docker network prune -f
- 重启Windows下的Docker Desktop,彻底重置网络状态。
- 重新构建启动服务:
docker-compose up --build
如果仍有问题可以临时修改.env中的DB_HOST为host.docker.internal,DB_PORT为32768,通过宿主机端口直接连接数据库临时验证业务逻辑,再排查网络问题。
内容的提问来源于stack exchange,提问作者Anatoly Bugakov
相关产品推荐
相关产品推荐

