docker-compose部署时Django容器无法连接PostgreSQL容器问题求助
问题排查与修复方案
1. 数据库连接地址配置错误
Postgres日志中输出的listening on IPv4 address "0.0.0.0", port 5432是服务端的监听标识,代表Postgres接受来自所有网卡的连接请求,并非客户端访问时使用的目标地址。
Docker Compose会为同一编排文件下的所有服务创建专属内部网络,服务名称就是内部网络的DNS域名,你配置中的数据库服务名为db,因此Django连接数据库的主机地址应该填db,而非0.0.0.0。
2. 数据库密码不匹配
你在docker-compose.yml中为Postgres配置的POSTGRES_PASSWORD值为qweytr21,但DATABASE_URL中填写的密码是somepassword,两边参数不一致会导致鉴权失败。
3. 服务启动时序问题
depends_on配置仅能保证db容器先于web容器启动,无法保证Postgres服务完成初始化、准备好接受连接后再启动web服务。Postgres首次启动时会执行数据库初始化逻辑,耗时通常在几秒不等,此时提前启动的Django执行迁移命令就会触发连接拒绝报错。
具体修复步骤
- 修改DATABASE_URL配置为:
DATABASE_URL=postgres://postgres:qweytr21@db:5432/music
- 解决启动时序问题,可选两种方案:
- 临时测试方案:修改web服务的启动命令,加入等待逻辑,示例:
command: sh -c "sleep 10 && pipenv run python manage.py migrate && pipenv run python manage.py runserver 0.0.0.0:8000" - 稳定方案:在镜像中集成
wait-for-it等端口检测脚本,启动时先检测db服务的5432端口可用后再执行后续命令。
- 临时测试方案:修改web服务的启动命令,加入等待逻辑,示例:
- 如果你之前已经启动过容器,建议先执行
docker-compose down -v删除旧的容器和数据卷,避免旧的数据库配置残留导致问题,再重新执行docker-compose up启动服务。
内容的提问来源于stack exchange,提问作者Adilet Usonov
相关产品推荐
相关产品推荐

