Docker-Compose下Postgres与Rust容器认证失败问题排查
解决Docker-Compose中Postgres与Rust容器的密码认证失败问题
我之前碰到过几乎一模一样的问题,大概率是这几个常见坑导致的,咱们一步步排查解决:
1. 优先排查Postgres容器的卷缓存问题
官方Postgres容器第一次启动时会初始化数据库、创建默认用户并设置密码,之后如果容器重启,哪怕你修改了POSTGRES_PASSWORD,只要关联的Docker卷还在,容器就会复用之前的初始化数据,新密码根本不会生效。
解决步骤:
- 先停止并删除当前容器:
docker-compose down - 彻底删除关联的卷(注意:这会清除数据库所有数据,仅测试环境使用):
docker-compose down -v - 重新构建并启动容器:
docker-compose up --build
2. 检查YAML中环境变量的引号转义问题
你的ROCKET_DATABASES是嵌套了JSON结构的字符串,YAML对引号的解析有时候会出问题。当前的写法用单引号包裹整个值,虽然理论上可行,但某些情况下YAML会误解析内部的双引号。
可以试试这两种更稳妥的写法:
写法一:转义内部双引号
environment: ROCKET_DATABASES: "{postgres={url=\"postgres://postgres:abcdefg@db:5432/postgres\"}}"
写法二:使用YAML块级字符串(推荐)
块级字符串可以避免所有引号转义的麻烦:
environment: ROCKET_DATABASES: | {postgres={url="postgres://postgres:abcdefg@db:5432/postgres"}}
3. 手动验证连接是否正常
如果上面两步都没解决,可以进入Rust容器手动测试数据库连接,排查是否是Rocket配置的问题:
- 进入web容器:
docker-compose exec web bash - 如果容器里有
psql客户端,直接执行连接命令:psql postgres://postgres:abcdefg@db:5432/postgres
如果这个命令能成功连接,说明数据库本身没问题,问题出在Rocket的配置解析上;如果还是认证失败,那还是数据库侧的密码/用户配置有问题。
4. 确认Postgres的认证规则
虽然日志显示匹配了md5认证的规则,但可以进入Postgres容器确认pg_hba.conf的配置:
docker-compose exec db cat /var/lib/postgresql/data/pg_hba.conf
找到类似这样的行,确保是md5而不是trust或其他:
host all all all md5
一般官方镜像默认就是这个配置,但排查的时候确认一下更稳妥。
内容的提问来源于stack exchange,提问作者Nicholas Yang
相关产品推荐
相关产品推荐

