GCE部署Percona MongoDB容器时磁盘挂载只读问题求助
解决GCE上Percona MongoDB Docker镜像挂载磁盘只读的问题
你遇到的这个“只读目录”报错,大概率是挂载磁盘的权限与容器内mongod进程的运行用户不匹配导致的——虽然错误提示指向只读,但实际是目录所有者没有给到mongod进程可写入的权限。下面是具体的排查和解决步骤:
1. 先确认容器内挂载目录的权限
SSH到你的GCE实例,执行以下命令查看/data/mongodb的权限详情:
# 替换[CONTAINER_NAME]为你的容器名称,可通过docker ps命令获取 docker exec -it [CONTAINER_NAME] ls -ld /data/mongodb
你大概率会看到目录所有者是root:root,但Percona MongoDB镜像默认是用mongodb用户运行mongod进程的,即便是你手动用root执行mongod,也会因为权限不匹配导致无法写入。
2. 修改挂载目录的所有者权限
进入容器的shell环境,将/data/mongodb的权限递归修改为mongodb用户所有:
docker exec -it [CONTAINER_NAME] bash # 在容器内部执行权限修改命令 chown -R mongodb:mongodb /data/mongodb exit
完成后再执行你原来的mongod启动命令:
docker exec -it [CONTAINER_NAME] mongod --configsvr --replSet rs0 --dbpath=/data/mongodb --bind_ip localhost
这时候应该就能正常启动,不会再出现只读目录的错误提示了。
3. 避免重复操作:创建实例时自动设置权限
如果你不想每次都手动修改权限,可以在创建GCE实例时,指定容器启动前先执行权限配置,再启动mongod服务。修改你的gcloud命令如下:
gcloud compute instances create-with-container mongo-config-f \ --zone us-central1-f \ --create-disk name=disk-1,size=1GB \ --container-mount-disk mount-path="/data/mongodb",mode=rw \ --container-image=docker.io/percona/percona-server-mongodb:4.2 \ --machine-type=f1-micro \ --container-command="bash" \ --container-args="-c","chown -R mongodb:mongodb /data/mongodb && exec mongod --configsvr --replSet rs0 --dbpath=/data/mongodb --bind_ip localhost"
这个命令会让容器先完成权限设置,再启动mongod服务,省去后续手动操作的步骤。
额外排查点:确认磁盘挂载模式
如果上面的方法没用,再检查GCE主机上的磁盘是否被只读挂载:
# 在GCE实例主机上执行 mount | grep disk-1
如果输出里包含ro字样,说明磁盘被只读挂载了,可执行以下命令重新挂载为读写模式:
# 替换[DEVICE_PATH]为你磁盘的设备路径,比如/dev/sdb sudo mount -o remount,rw [DEVICE_PATH]
不过这种情况比较少见,因为--container-mount-disk默认的mode就是rw,只要你没手动指定ro,都应该是读写挂载状态。
内容的提问来源于stack exchange,提问作者Mr_Antivius
相关产品推荐
相关产品推荐

