Docker Compose部署PostgreSQL自定义用户登录失败求助
Docker Compose部署PostgreSQL遇到角色不存在问题
我正在学习Docker Compose(4.11.1),碰到一个奇怪的PostgreSQL问题:全新环境下用docker run设置POSTGRES_USER=myuser能正常登录,但用Docker Compose配置相同环境变量后,在容器内执行psql -U myuser会提示role "myuser" does not exist错误。两种环境变量写法都试过了,Docker日志也没异常,更奇怪的是应用能正常连接数据库,只有容器内本地登录失败,求解决办法。
可用的非Docker Compose方式
docker run --name postgres -e POSTGRES_PASSWORD=password -e POSTGRES_USER=myuser -d postgres root@b2fc89a75d71:/# psql -U myuser psql (14.5 (Debian 14.5-1.pgdg110+1)) Type "help" for help. myuser=# exit
部分可用的Docker Compose配置(默认postgres用户可登录)
version: '3.9' services: postgres: image: postgres ports: - 5432:5432 environment: - POSTGRES_PASSWORD=password
登录结果:
root@0ed9caa9c68f:/# psql -U postgres psql (14.5 (Debian 14.5-1.pgdg110+1)) Type "help" for help. postgres=# exit
不可用的Docker Compose配置
version: '3.9' services: postgres: image: postgres ports: - 5432:5432 environment: - POSTGRES_PASSWORD=password - POSTGRES_USER=myuser
执行登录命令后报错:
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "myuser" does not exist
已尝试的两种环境变量写法
第一种:
environment: - POSTGRES_PASSWORD=password - POSTGRES_USER=myuser
第二种:
environment: POSTGRES_PASSWORD: password POSTGRES_USER: myuser
Docker日志(正常与异常情况一致)
该数据库系统的文件将归用户 "postgres" 所有。 该用户也必须拥有服务器进程。 数据库集群将使用区域设置 "en_US.utf8" 初始化。 默认数据库编码已相应设置为 "UTF8"。 默认文本搜索配置将设置为 "english"。 数据页校验已禁用。 修复现有目录 /var/lib/postgresql/data 的权限... 完成 创建子目录... 完成 选择动态共享内存实现... posix 选择默认最大连接数... 100 选择默认共享缓冲区... 128MB 选择默认时区... Etc/UTC 创建配置文件... 完成 运行引导脚本... 完成 执行引导后初始化... 完成 initdb: 警告:为本地连接启用 "trust" 认证 您可以通过编辑 pg_hba.conf 或使用 -A 选项,或下次运行 initdb 时使用 --auth-local 和 --auth-host 来更改此设置。 将数据同步到磁盘... 完成 成功。您现在可以使用以下命令启动数据库服务器: pg_ctl -D /var/lib/postgresql/data -l logfile start 等待服务器启动....2022-08-24 04:46:06.058 UTC [49] 日志:启动 PostgreSQL 14.5 (Debian 14.5-1.pgdg110+1),运行于 x86_64-pc-linux-gnu,由 gcc (Debian 10.2.1-6) 10.2.1 20210110 编译,64位 2022-08-24 04:46:06.060 UTC [49] 日志:监听 Unix 套接字 "/var/run/postgresql/.s.PGSQL.5432" 2022-08-24 04:46:06.086 UTC [50] 日志:数据库系统已于 2022-08-24 04:46:03 UTC 关闭 2022-08-24 04:46:06.122 UTC [49] 日志:数据库系统已准备好接受连接 完成 服务器已启动 /usr/local/bin/docker-entrypoint.sh: 忽略 /docker-entrypoint-initdb.d/* 等待服务器关闭...2022-08-24 04:46:06.480 UTC [49] 日志:收到快速关闭请求 .2022-08-24 04:46:06.483 UTC [49] 日志:中止所有活动事务 2022-08-24 04:46:06.485 UTC [49] 日志:后台工作进程 "logical replication launcher"(PID 56)以退出码 1 退出 2022-08-24 04:46:06.487 UTC [51] 日志:正在关闭 2022-08-24 04:46:06.544 UTC [49] 日志:数据库系统已关闭 完成 服务器已停止 PostgreSQL 初始化过程完成;准备启动。 2022-08-24 04:46:06.634 UTC [1] 日志:启动 PostgreSQL 14.5 (Debian 14.5-1.pgdg110+1),运行于 x86_64-pc-linux-gnu,由 gcc (Debian 10.2.1-6) 10.2.1 20210110 编译,64位 2022-08-24 04:46:06.634 UTC [1] 日志:监听 IPv4 地址 "0.0.0.0",端口 5432 2022-08-24 04:46:06.634 UTC [1] 日志:监听 IPv6 地址 "::",端口 5432 2022-08-24 04:46:06.639 UTC [1] 日志:监听 Unix 套接字 "/var/run/postgresql/.s.PGSQL.5432" 2022-08-24 04:46:06.669 UTC [61] 日志:数据库系统已于 2022-08-24 04:46:06 UTC 关闭 2022-08-24 04:46:06.699 UTC [1] 日志:数据库系统已准备好接受连接
解决办法
1. 清理旧数据卷(彻底解决,适合全新环境)
问题根源:PostgreSQL容器首次启动时会初始化数据卷,后续修改环境变量不会触发重新初始化,旧数据卷里仍保留默认的postgres角色。
# 停止并删除容器 docker-compose down # 删除PostgreSQL相关数据卷(注意:会丢失所有数据) docker volume rm $(docker volume ls -q | grep postgres) # 重新启动容器 docker-compose up -d
2. 带数据卷配置的清理(更可控)
先在Compose中明确指定数据卷:
version: '3.9' services: postgres: image: postgres ports: - 5432:5432 environment: POSTGRES_PASSWORD: password POSTGRES_USER: myuser volumes: - postgres_data:/var/lib/postgresql/data volumes: postgres_data:
然后执行清理启动:
docker-compose down -v docker-compose up -d
3. 临时绕过(无需清理数据)
如果不想丢失数据,尝试用TCP连接而非Unix socket登录:
psql -U myuser -h localhost
内容的提问来源于stack exchange,提问作者Linus
相关产品推荐
相关产品推荐

