使用Rex-Ray S3外部卷的Docker Compose部署PostgreSQL/PGAdmin失败排查
解决Docker Compose中Rex-Ray S3FS卷无法同步PostgreSQL/PGAdmin数据的问题
从你的描述来看,手动挂载卷到CentOS容器能正常同步S3,但Compose中的PostgreSQL和PGAdmin却不行,最可能的原因是容器内进程的权限与卷的默认权限不匹配,导致无法写入数据到S3卷。
问题分析
手动用centos容器测试时,你是以root用户操作的,而PostgreSQL和PGAdmin容器默认使用非root用户运行:
- PostgreSQL容器默认使用
postgres用户(UID/GID 999) - PGAdmin 4容器默认使用
pgadmin用户(UID/GID 5050)
Rex-Ray S3FS创建的卷默认权限是root:root,容器内的非root用户没有写入权限,所以数据无法被写入到S3卷中,自然在S3桶里看不到内容。
解决方案
你需要在创建Rex-Ray卷时,指定挂载选项,将卷的权限映射到容器内运行的用户UID/GID,具体步骤如下:
1. 删除现有卷(如果已创建)
docker volume rm myrexvol1-1234 myrexvol2-1234
2. 重新创建卷,指定匹配容器用户的UID/GID
针对PGAdmin的卷(匹配UID/GID 5050):
docker volume create --driver rexray/s3fs:0.11.4 \ --opt s3fsopts="uid=5050,gid=5050,allow_other" \ myrexvol1-1234
针对PostgreSQL的卷(匹配UID/GID 999):
docker volume create --driver rexray/s3fs:0.11.4 \ --opt s3fsopts="uid=999,gid=999,allow_other" \ myrexvol2-1234
这里的s3fsopts参数:
uid=xxx/gid=xxx:将卷的所有者设置为容器内用户的UID/GIDallow_other:允许其他用户访问该卷,确保容器内进程能正常读写
3. 重启Docker Compose服务
docker-compose down docker-compose up -d
验证方法
- 查看容器日志,确认没有权限错误:
docker logs databasecontainer docker logs pgadmincontainer - 进入PostgreSQL容器,尝试写入数据到卷目录:
然后检查S3桶,应该能看到同步的docker exec -it databasecontainer bash cd /var/lib/postgresql/data touch test-filetest-file。
额外排查点
如果问题仍存在,可以查看Rex-Ray插件的日志,排查挂载或写入错误:
docker plugin logs rexray/s3fs:0.11.4
内容的提问来源于stack exchange,提问作者user1665355
相关产品推荐
相关产品推荐

