Docker中PostgreSQL卷存储位置、权限问题及正确创建方式咨询
问题解答
问题1:当前目录生成postgres-data文件夹的相关说明
- 该现象完全符合预期:你配置的
./postgres-data:/var/lib/postgresql/data属于绑定挂载(Bind Mount),而非Docker默认的命名卷,绑定挂载的特性就是会直接映射宿主机器上的指定路径,路径不存在时会自动创建对应文件夹。你在yaml顶层声明的volumes.postgres-data属于命名卷定义,但你在服务配置里没有引用这个命名卷,所以命名卷没有生效,自然不会存到/var/lib/docker/volumes路径下。 - 是否是良好实践需要分场景判断:
- 本地开发场景下,绑定挂载放在同级目录没问题,方便直接查看、备份、修改数据,操作门槛更低
- 生产环境推荐使用Docker管理的命名卷,Docker会自动处理权限、存储驱动优化,避免宿主文件系统的权限冲突、误删等问题,稳定性和可靠性更高。
问题2:文件夹权限异常的原因和解决方法
原因说明
Postgres官方镜像默认在容器内使用UID为999的postgres用户运行进程,绑定挂载时容器会自动把宿主上的./postgres-data文件夹的所有者修改为UID 999,该用户不属于你当前登录的宿主用户,也和docker组权限无关(docker组仅控制你是否有权限调用Docker daemon接口,不影响宿主文件系统的权限控制),所以你直接访问会提示无权限。
正确使用方式
方案1(更推荐):使用命名卷
修改docker-compose配置,直接引用你顶层声明的命名卷即可,不需要手动处理权限:
version: '3.7' volumes: postgres-data: services: postgres: environment: - POSTGRES_PASSWORD=mypwd - POSTGRES_USER=randomuser image: 'postgres:14' restart: always volumes: # 去掉前面的./,直接用命名卷名 - 'postgres-data:/var/lib/postgresql/data'
如果需要备份命名卷数据,可以使用命令:
docker run --rm -v postgres-data:/volume -v 你要存备份的本地路径:/backup alpine tar cvzf /backup/postgres_backup.tar.gz /volume
方案2:坚持使用绑定挂载的处理方法
提前手动创建postgres-data文件夹,再执行以下两种操作二选一:
- 把文件夹所有者修改为容器内postgres用户对应的UID:
sudo chown -R 999:999 ./postgres-data
启动后如果需要访问文件夹内容,使用sudo操作即可。
2. 指定容器用你当前宿主用户的UID运行,先执行id -u、id -g拿到你的用户ID和组ID,比如输出为1000、1000,就在服务配置里加user参数:
services: postgres: # 替换为你自己的uid:gid user: 1000:1000 environment: - POSTGRES_PASSWORD=mypwd - POSTGRES_USER=randomuser image: 'postgres:14' restart: always volumes: - './postgres-data:/var/lib/postgresql/data'
内容的提问来源于stack exchange,提问作者EmilyD
相关产品推荐
相关产品推荐

