Docker Compose下Django应用无法连接Postgres数据库问题求助
问题根因
连接失败是三类配置问题叠加导致的:
- 两个容器处于隔离的网络中:从IP段判断,Postgres容器(172.19.0.2)接入的是Docker Compose自动创建的项目自定义网桥,Django容器(172.17.0.2)接入的是Docker全局默认的
bridge网桥,两个网络默认不互通,既无法ping通,也不能通过服务名做DNS解析。出现这个问题的核心原因是你给Django服务设置了固定容器名drf_app,如果之前手动启动过同名容器,本次执行docker-compose up时会直接复用旧容器的网络配置,不会将其接入当前项目的自定义网络。 - .env配置存在语法错误:你在
SQL_HOST参数后写了行内注释,Docker Compose加载环境变量时不会自动过滤值后空格+#的注释内容,实际读取到的SQL_HOST值是db #this one should match the service name,而非预期的纯值db,就算网络连通也会触发主机名解析失败。 - env_file路径配置错误:你写的
env_file: /.env指向宿主机根目录下的文件,而非项目目录中你实际配置的.env文件,会直接导致环境变量加载异常。
修复步骤
按顺序执行以下操作即可解决问题:
- 清理现有异常容器和残留网络
docker-compose down docker rm -f drf_app - 修正
docker-compose.yml配置,调整env_file路径,移除自定义网络下不需要的过时links配置,修正后内容如下:version: '3.3' services: web: build: . container_name: drf_app volumes: - ./src:/drf ports: - 9090:8080 env_file: - ./.env depends_on: - db db: image: postgres:13-alpine environment: - POSTGRES_HOST_AUTH_METHOD=trust - POSTGRES_USER=myuser - POSTGRES_PASSWORD=mypass - POSTGRES_DB=mydb volumes: - postgres_data:/var/lib/postgresql/data/ ports: - 5432:5432 volumes: postgres_data: - 修正
.env配置,移除行内注释,保证参数值无多余字符,注释需要单独占行书写:SQL_ENGINE=django.db.backends.postgresql SQL_DATABASE=mydb SQL_USER=myuser SQL_PASSWORD=mypass SQL_HOST=db SQL_PORT=5432 - 强制重建所有服务启动,避免复用旧容器配置:
docker-compose up --force-recreate -d
验证说明
启动完成后可做两步校验:
- 进入Django容器执行
ping db,能正常解析到db容器的IP即代表网络连通 - 执行Django数据库迁移命令,无连接报错即配置生效
注意:
depends_on仅控制容器启动顺序,不会等待Postgres服务完全就绪,如果启动时偶发连接失败,可以在Django启动脚本中增加几秒等待时间,或者用端口检测工具确认数据库可连接后再启动Django服务。
内容的提问来源于stack exchange,提问作者paolop
相关产品推荐
相关产品推荐

