使用docker-compose部署Django+Postgres时postgres用户密码认证错误
报错原因排查与解决方案
你遇到的django.db.utils.OperationalError: FATAL: password authentication failed for user "postgres"报错,在当前配置下绝大多数是由旧Postgres持久化数据冲突导致,其余小概率为服务启动时序问题,具体排查解决步骤如下:
核心原因:旧持久化数据冲突
Postgres容器的
POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB环境变量仅在第一次初始化数据库实例时生效,如果你此前启动过db服务,本地挂载的./data/db目录已经生成了旧的数据库文件(当时配置的账号密码和现在不一致),后续修改docker-compose的环境变量不会更新已存在的数据库账号信息,就会触发密码验证失败。
解决步骤
- 第一步:清理旧资源
先停止所有关联容器,执行命令:
再手动删除本地挂载的数据库目录docker-compose down -v./data/db,彻底清除旧的数据库实例数据。 - 第二步:优化启动时序(可选)
当前配置的depends_on仅保证db容器先启动,不会等待Postgres服务完全初始化完成就启动web服务,小概率会在数据库未就绪时触发连接异常,可修改web服务的command参数增加等待逻辑:
生产环境可使用command: sh -c "sleep 15 && python manage.py runserver 0.0.0.0:8000"pg_isready等工具做更精准的存活检测。 - 第三步:重新启动服务
执行命令重新构建启动服务即可:docker-compose up --build
其他可排查点
- 检查本地是否有独立运行的Postgres服务占用5432端口,若存在可停止本地Postgres服务,或修改docker-compose中db的端口映射为
"5433:5432" - 确认settings.py中的数据库配置和docker-compose中db的环境变量完全匹配,你当前的配置是对齐的,无需修改。
内容的提问来源于stack exchange,提问作者Joseph Adam
相关产品推荐
相关产品推荐

