You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:25:50