PostgreSQL 12.12 Docker镜像多用户创建失败及认证问题求助
PostgreSQL 12.12 Docker镜像用户认证问题排查与解决
问题根源
官方PostgreSQL Docker镜像从未原生支持USERS_AND_DBS这个自定义环境变量。你之前在10.5版本镜像中能生效,大概率是该镜像包含了自定义的初始化脚本(通常放在/docker-entrypoint-initdb.d/目录下),用来解析这个变量并自动创建用户和数据库。而升级到12.12的官方镜像后,这个自定义逻辑被移除,导致用户U1、U2无法被正确创建,进而出现认证失败。
解决方法
改用官方镜像原生支持的初始化方式,通过添加自定义SQL脚本创建额外用户和数据库:
- 创建初始化SQL脚本
在项目根目录下创建init-db文件夹,新建create-users.sql文件,写入以下内容:
-- 创建用户U1并设置密码 CREATE USER U1 WITH PASSWORD 'password'; -- 创建数据库U1并设置所有者为U1 CREATE DATABASE U1 OWNER U1; -- 创建用户U2并设置密码 CREATE USER U2 WITH PASSWORD 'password'; -- 创建数据库U2并设置所有者为U2 CREATE DATABASE U2 OWNER U2;
- 修改docker-compose配置
移除USERS_AND_DBS环境变量,添加目录挂载,将本地init-db目录挂载到容器的/docker-entrypoint-initdb.d/路径(官方镜像会自动执行该目录下的脚本,仅在首次初始化数据库时运行):
services: postgres: image: postgres:12.12 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres volumes: - ./init-db:/docker-entrypoint-initdb.d/ # 可选:挂载数据卷持久化数据库数据 - postgres-data:/var/lib/postgresql/data volumes: postgres-data:
- 验证修复
- 如果是测试环境,先删除旧容器和数据卷:
docker-compose down -v - 重新启动容器:
docker-compose up -d - 进入容器测试用户认证:
docker exec -it <容器ID> psql -U U1 -d U1
输入密码password即可正常登录。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

