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

使用Docker Secrets配置Postgres凭证时认证失败问题排查

使用Docker Secrets配置Odoo+PostgreSQL账号密码失败

我碰到了类似的认证失败问题,但原因不是密码文件有多余字符。我用Odoo15、PostgreSQL14和docker-compose,想通过Docker Secrets配置数据库账号密码,但一直失败。

我的docker-compose配置如下:

version: '2'
services:
  db:
    container_name: odoo_db
    image: postgres:14
    user: root
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=odoo
      - POSTGRES_PASSWORD_FILE=/run/secrets/postgresql_password
    volumes:
        - ./postgresql:/var/lib/postgresql/data
    secrets:
      - postgresql_password
    ports:
      - 5432:5432
    restart: always             # run as a service

  odoo15:
    container_name: odoo_web
    image: odoo:15
    depends_on:
      - db
    user: root
    volumes:
      - ./addons:/mnt/extra-addons
      - ./etc:/etc/odoo
    ports:
      - "10013:8069"
    tty: true
    command: --
    environment:
      - HOST=db
      - USER=odoo
      - PASSWORD_FILE=/run/secrets/postgresql_password
    secrets:
      - postgresql_password
    restart: always             # run as a service

secrets:
  postgresql_password:
    file: odoo_pg_pass

密码文件odoo_pg_pass只包含内容123,没有空格、回车或换行符。

出现的错误信息:

odoo_db   | 2022-09-13 06:43:00.880 UTC [1058] FATAL:  password authentication failed for user "odoo"
odoo_db   | 2022-09-13 06:43:00.880 UTC [1058] DETAIL:  Connection matched pg_hba.conf line 100: "host all all all scram-sha-256"

补充测试结果:

  • 移除Secret配置,直接用POSTGRES_PASSWORD环境变量时,密码设为odoo可以成功,但设为123不行;
  • 用Secrets配合POSTGRES_PASSWORD_FILE时,密码设为odoo可行,其他密码都不行,像是密码被硬编码,但递归搜索没找到可疑内容;
  • 修改db服务的POSTGRES_USER和odoo15服务的USER为非odoo值,问题依旧。

解决方案

1. 调整PostgreSQL密码加密方式

PostgreSQL14默认使用scram-sha-256加密,但Odoo15对该加密方式的兼容性存在问题。可以修改PostgreSQL的加密规则:

  • 在db服务的environment中添加配置:POSTGRES_INITDB_ARGS="--auth-host=md5"
  • 或者进入容器修改pg_hba.conf,将对应行的scram-sha-256替换为md5

2. 清理旧数据库数据卷

PostgreSQL初始化后会将密码哈希值持久化在数据卷中,后续修改密码(无论用环境变量还是Secrets)都不会覆盖旧值。需要彻底重置数据:

  1. 停止并删除容器:docker-compose down
  2. 删除本地数据卷目录:rm -rf ./postgresql
  3. 重新启动容器:docker-compose up -d

3. 验证Secret文件的正确性

进入db容器确认Secret内容和权限:

  • 进入容器:docker exec -it odoo_db bash
  • 查看Secret内容:cat /run/secrets/postgresql_password,确保输出为123
  • 检查文件权限:ls -l /run/secrets/postgresql_password,确保root用户有读取权限

4. 确认Odoo的密码传递逻辑

进入Odoo容器验证密码文件是否被正确读取:

  • 进入容器:docker exec -it odoo_web bash
  • 查看环境变量:echo $PASSWORD_FILE
  • 读取文件内容:cat $PASSWORD_FILE,确保和Secret文件内容一致

内容的提问来源于stack exchange,提问作者lalebarde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:10:45