使用docker-compose部署Postgres实例时连接失败求助
问题描述
我配置了这样的docker-compose.yml来部署Postgres和Adminer:
version: '3.1' services: db: image: postgres restart: always environment: POSTGRES_USER: qQmhGTYnBEqfokY3p64x POSTGRES_PASSWORD: HydJ47qr4F7XqsFhcTsL POSTGRES_DB: db adminer: image: adminer restart: always ports: - 8080:8080
启动后通过Adminer(localhost:8080)连接PostgreSQL,填写对应用户名、密码和数据库名db时,报错:
Unable to connect to PostgreSQL server: FATAL: password authentication failed for user "qQmhGTYnBEqfokY3p64x"
查看db容器日志,得到更细节的错误:
db_1 | 2023-09-10 13:09:20.373 UTC [33] FATAL: password authentication failed for user "qQmhGTYnBEqfokY3p64x"
db_1 | 2023-09-10 13:09:20.373 UTC [33] DETAIL: Role "qQmhGTYnBEqfokY3p64x" does not exist.
请问我哪里操作错了?
我的解答
嘿,这个坑我刚踩过没多久!问题出在Postgres的初始化机制上:那些POSTGRES_*环境变量只有在容器第一次启动、初始化数据卷的时候才会生效。
你大概率是之前已经启动过这个db容器(可能当时用的是默认用户postgres,或者其他用户名),之后修改了docker-compose.yml里的环境变量再重启,但Postgres已经把初始的用户、数据库信息存在数据卷里了,新的环境变量根本不会被读取。
给你几个简单的解决步骤:
彻底清理旧容器和数据卷
先停掉并删除当前的容器,一定要加上-v参数把关联的数据卷也删掉,不然旧数据还在:docker-compose down -v重新启动服务
清理完之后,重新启动容器,这次Postgres会重新初始化,按照你配置的环境变量创建用户qQmhGTYnBEqfokY3p64x、数据库db,并设置对应的密码:docker-compose up -d再次尝试连接
等个10秒左右让容器完全启动,再用Adminer去连接,应该就能成功了。
另外给你提个醒:如果以后需要修改Postgres的用户信息或者数据库配置,不能直接改docker-compose.yml就重启,除非你愿意丢弃现有数据。如果要保留数据,得手动进入容器,用SQL命令去修改用户密码或者创建新用户哦。
备注:内容来源于stack exchange,提问作者Hasan

