使用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)都不会覆盖旧值。需要彻底重置数据:
- 停止并删除容器:
docker-compose down - 删除本地数据卷目录:
rm -rf ./postgresql - 重新启动容器:
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
相关产品推荐
相关产品推荐

