Docker非root用户挂载卷后无目录访问权限的解决方案咨询
PostgreSQL Docker挂载目录权限问题的非sudo/非chown解决方案
针对你遇到的非root用户pg运行PostgreSQL容器后,挂载目录权限不匹配导致无法访问的问题,以下是几种无需给pg用户sudo权限或手动chown目录的解决办法:
1. 让容器使用主机pg用户的UID/GID运行
PostgreSQL官方镜像默认用UID为70的postgres用户启动进程。你可以在运行容器时指定--user参数,让容器内进程使用主机pg用户的UID和GID,这样容器创建的文件权限会自动匹配主机pg用户:
- 先查询
pg用户的UID和GID:
输出示例:id pguid=1001(pg) gid=1001(pg) - 用获取到的UID/GID启动容器:
这样容器内的docker run -d -u 1001:1001 -v /home/pg/pg/:/var/lib/postgresql/data/ postgrespostgres进程会以主机pg用户的身份运行,挂载目录的权限会与pg用户匹配,可直接访问。
2. 给挂载目录设置ACL权限
在运行容器前,通过ACL规则给容器内默认的postgres用户(UID=70)授予挂载目录的读写权限,同时保留主机pg用户的访问权限:
# 给现有目录添加权限 setfacl -m u:70:rwx /home/pg/pg # 让后续创建的文件/目录继承该权限 setfacl -d -m u:70:rwx /home/pg/pg
执行后,容器内的postgres用户能正常读写目录,主机pg用户也可以访问该目录下的内容。
3. 使用Docker管理卷替代主机目录挂载
如果不需要直接在主机文件系统操作PostgreSQL数据,可使用Docker自带的卷存储,完全绕开主机目录权限问题:
docker run -d -v pg_data:/var/lib/postgresql/data/ postgres
数据会存储在Docker管理的卷中,pg用户可通过docker exec进入容器操作数据,或用docker cp在主机和容器间传输文件。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

