Docker部署pgAdmin遇权限及密码读取问题求助
问题解决步骤
一、修复初始权限错误(已部分解决,完善方案)
pgAdmin容器启动时的权限错误是因为容器内/var/lib/pgadmin目录的所有权不匹配,可通过以下两种方式解决:
方式1:自定义Dockerfile(推荐)
修改你的Dockerfile,确保pgadmin用户拥有目录权限并设置pgpass文件的安全权限:
FROM dpage/pgadmin4:6.20 ADD servers.json /pgadmin4/servers.json ADD pgpass /var/lib/pgadmin/storage/pgadmin4_pgadmin.org/pgpass USER root # 设置目录所有权和pgpass文件的600权限(PostgreSQL要求密码文件不可被其他用户读取) RUN chown -R pgadmin:pgadmin /var/lib/pgadmin && \ chmod 600 /var/lib/pgadmin/storage/pgadmin4_pgadmin.org/pgpass USER pgadmin
方式2:Docker Compose命令修正权限
无需自定义镜像,在docker-compose中添加启动命令修正权限:
pgadmin: container_name: pgadmin image: dpage/pgadmin4:6.20 environment: - PGADMIN_DEFAULT_EMAIL=pgadmin4@pgadmin.org - PGADMIN_DEFAULT_PASSWORD=admin - PGADMIN_CONFIG_SERVER_MODE=True ports: - "5050:80" volumes: - ./backend/pgadmin/servers.json:/pgadmin4/servers.json - ./backend/pgadmin/pgpass:/var/lib/pgadmin/storage/pgadmin4_pgadmin.org/pgpass depends_on: - db command: > sh -c "chown -R pgadmin:pgadmin /var/lib/pgadmin && chmod 600 /var/lib/pgadmin/storage/pgadmin4_pgadmin.org/pgpass && /entrypoint.sh"
二、修复数据库连接密码错误
当前出现fe_sendauth: no password supplied错误,存在三个核心问题:
1. 数据库名称不匹配
- Docker Compose中
POSTGRES_DB设置为GOYN,但servers.json的MaintenanceDB和pgpass文件中使用的是MYDB,需统一名称:- 选项A:修改docker-compose的数据库名称:
environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=MYDB - 选项B:修改
servers.json和pgpass:- servers.json:
"MaintenanceDB": "GOYN" - pgpass文件:
db:5432:GOYN:postgres:postgres
- servers.json:
- 选项A:修改docker-compose的数据库名称:
2. PassFile路径错误
servers.json中PassFile指向/pgpass,但实际文件挂载在/var/lib/pgadmin/storage/pgadmin4_pgadmin.org/pgpass,需修正路径:
"PassFile": "/var/lib/pgadmin/storage/pgadmin4_pgadmin.org/pgpass"
3. 确保数据库服务就绪
depends_on仅保证容器启动,不确保数据库服务就绪,添加健康检查等待数据库可用:
db: container_name: postgis image: postgis/postgis:15-3.3 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=GOYN # 对应你选择的数据库名称 ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d GOYN"] # 数据库名称需匹配 interval: 5s timeout: 5s retries: 5 pgadmin: # ...其他配置 depends_on: db: condition: service_healthy
最终验证步骤
- 清理旧容器和卷:
docker-compose down -v - 重新启动服务:
docker-compose up --build(使用自定义镜像时加--build) - 访问pgAdmin(http://localhost:5050),检查服务器连接是否正常
内容的提问来源于stack exchange,提问作者user1315621
相关产品推荐
相关产品推荐

