为何Docker会更改宿主机挂载目录下RocksDB文件的权限归属?
问题描述
我们通过docker-java-api动态创建容器,部分容器重度使用RocksDB数据库,其文件存储在宿主机上,宿主机上初始文件权限如下:
ls -lrt /mnt/data/rocksdb -rw-r--r-- 1 root root 8374 Nov 28 15:32 fileA -rw-r--r-- 1 root root 0 Nov 28 15:32 fileB -rw-r--r-- 1 root root 37 Nov 28 15:32 .... -rw-r--r-- 1 root root 16 Nov 28 15:32 fileC -rw-r--r-- 1 root root 19646 Nov 28 15:32 .. -rw-r--r-- 1 root root 22500 Nov 28 15:32 .... etc
我们将/mnt/data/rocksdb挂载至运行数据库应用的容器中,启动容器后,宿主机上该目录下的文件权限归属变为:
ls -lrnt /mnt/data/rocksdbdata/ total 84092 -rw-r--r-- 1 999 999 8374 Nov 28 15:32 fileA -rw-r--r-- 1 999 999 0 Nov 28 15:32 LOCK -rw-r--r-- 1 999 999 37 Nov 28 15:32 fileB -rw-r--r-- 1 999 999 16 Nov 28 15:32 fileC -rw-r--r-- 1 999 999 19646 Nov 28 15:32 ... -rw-r--r-- 1 999 999 22500 Nov 28 15:32 .....etc
其中UID:GID(999:999)对应的用户为docker,请问此现象的原因是什么?
原因分析
- 容器内运行RocksDB的进程是以UID为999的用户执行的,这个用户是镜像预设的非root用户,对应宿主机上的docker用户
- Docker挂载宿主机目录时,文件系统权限是基于UID/GID而非用户名识别的:容器内进程用999用户读写挂载目录的文件时,宿主机会把这些文件的所有者映射为宿主机上UID=999、GID=999的用户
- 初始文件由宿主机root用户创建,但容器内进程修改或写入文件时,会以自身运行的UID/GID更新文件权限属性,导致宿主机上看到的所有者变为999:999
内容的提问来源于stack exchange,提问作者gai-jin
相关产品推荐
相关产品推荐

