Spring Boot连接Docker版PostgreSQL报认证失败与编码异常问题
报错本质是PostgreSQL服务端拒绝了amigoscode用户的密码认证,按以下优先级排查即可解决:
1. 最高概率:Docker持久化卷残留旧配置,你设置的密码未实际生效
PostgreSQL官方Docker镜像的POSTGRES_USER、POSTGRES_PASSWORD环境变量,仅在数据卷首次初始化时生效。如果你之前启动过同名PostgreSQL容器、修改过compose文件中的密码、或者本地残留同名数据卷,哪怕你现在compose里写的密码是password,容器内实际运行的数据库还是用的第一次初始化时设置的旧密码。
你说pgAdmin可以正常登录,大概率是之前在pgAdmin里保存了旧密码的连接配置,自动完成了认证,不是用你当前compose里配置的密码登录的。
修复步骤:
- 停掉当前运行的容器:
docker compose down - 查看本地所有docker卷,找到对应postgres的卷(一般是
[项目目录名]_postgres格式),执行docker volume rm <对应卷名>删除残留卷 - 重新执行
docker compose up -d启动服务,这次会完全重新初始化数据库,你配置的账号密码才会真正写入数据库。注意:删除卷会清空容器内之前存储的所有数据库数据,你之前在pgAdmin中创建的customer库会被清除。考虑到你Spring Boot配置了
ddl-auto: create-drop,启动时会自动创建表结构,不需要手动提前建库建表。
2. 次高概率:宿主机端口冲突,Spring Boot连到了其他PostgreSQL实例
pgAdmin和PostgreSQL在同一个Docker内部桥接网络中,它访问数据库走的是容器内部网络,不依赖宿主机的5432端口映射。如果你的本地电脑本身安装了PostgreSQL服务、或者其他程序占用了5432端口,Spring Boot配置里写的localhost:5432实际连接的不是你Docker中启动的PostgreSQL实例,自然会报密码错误。
排查步骤:
- 执行
docker ps查看postgres容器的运行状态,确认端口映射中存在0.0.0.0:5432->5432/tcp规则,没有端口占用报错 - 临时关闭本地原生安装的PostgreSQL服务,再重启Spring Boot测试
- 可以直接在宿主机执行连接测试命令:
psql -h localhost -p 5432 -U amigoscode -W,输入密码password,如果连不上就说明端口映射或密码配置存在问题。
3. 小概率:用户权限配置异常
如果前两步排查完仍报错,可以进入容器内部检查用户权限配置:
- 执行
docker exec -it postgres psql -U postgres进入数据库命令行 - 执行
\du查看amigoscode用户属性,确认该用户拥有LOGIN权限 - 执行以下SQL重置密码并授权:
ALTER USER amigoscode WITH LOGIN PASSWORD 'password'; GRANT ALL PRIVILEGES ON DATABASE customer TO amigoscode;
执行完成后重启Spring Boot即可正常连接。
内容的提问来源于stack exchange,提问作者Kaleb Tisnado Flores

