本文章主要針對(duì)以下兩種場(chǎng)景進(jìn)行分析
- 本地掛載
- NFS掛載
本地掛載
結(jié)論:掛載的文件的用戶權(quán)限,在容器內(nèi)部看到的uid、gid及操作權(quán)限,與宿主機(jī)上看到的一致
宿主機(jī)新建掛載目錄:

宿主機(jī)查看權(quán)限
拉起docker鏡像,并把宿主機(jī)目錄掛載到容器中
docker run -d --rm --name busybox -v /root/test:/tmp/ busybox sleep infinity

查看容器內(nèi)文件目錄權(quán)限
一定要確保容器執(zhí)行者的權(quán)限和掛載數(shù)據(jù)卷對(duì)應(yīng),如果掛載了root的文件到容器內(nèi)部,而容器內(nèi)部執(zhí)行uid不是0,則報(bào)錯(cuò)沒(méi)有權(quán)限
NFS掛載
服務(wù)端:

NFS服務(wù)端共享文件權(quán)限

owner的uid及gid
容器內(nèi):

NFS掛載到tmp
結(jié)論:掛載的文件的用戶權(quán)限,在容器內(nèi)部看到的uid、gid及操作權(quán)限,與NFS服務(wù)端上看到的一致。
但是容器中的用戶身份對(duì)于NFS服務(wù)端來(lái)說(shuō),需要根據(jù)NFS的配置文件進(jìn)行判斷:
- root_squash:默認(rèn)選項(xiàng),當(dāng)客戶端使用的是root用戶時(shí),則映射到NFS服務(wù)器的用戶為NFS的匿名用戶(nfsnobody)。
- no_root_squash:當(dāng)客戶端使用的是root用戶時(shí),則映射到FNS服務(wù)器的用戶依然為root用戶。
- all_squash:默認(rèn)選項(xiàng),將所有訪問(wèn)NFS服務(wù)器的客戶端的用戶都映射為匿名用戶,不管客戶端使用的是什么用戶。
- no_all_squash:當(dāng)客戶端使用的用戶的uid和gid在服務(wù)器端中也存在一致uid和gid的用戶時(shí),則映射到NFS服務(wù)器的用戶為對(duì)應(yīng)用戶,其他用戶則映射為匿名用戶
- anonuid:設(shè)置映射到本地的匿名用戶的UID
- anongid:設(shè)置映射到本地的匿名用戶的GID
舉例:

假設(shè)服務(wù)器端共享文件夾的訪問(wèn)權(quán)限
服務(wù)端NFS配置:
no_root_squash,no_all_squash
存在以下幾種情況:
- 客戶端當(dāng)前用戶為root(uid=0,gid=0),正常讀寫(xiě);
- 客戶端當(dāng)前用戶為test(uid=1001,gid=1001),映射成服務(wù)端的test,正常讀寫(xiě);
- 客戶端當(dāng)前用戶為user1(uid=1001,gid=1001),映射成服務(wù)端的test,正常讀寫(xiě);
- 客戶端當(dāng)前用戶為rancher(uid=1000,gid=1000),映射成服務(wù)端的rancher,只能讀不能寫(xiě);
- 客戶端當(dāng)前用戶為user2(uid=2000,gid=2000),映射成服務(wù)端的nfsnobody,只能讀不能寫(xiě)
no_root_squash,no_all_squash,anonuid=1001,anongid=1001
- 客戶端當(dāng)前用戶為root(uid=0,gid=0),正常讀寫(xiě);
- 客戶端當(dāng)前用戶為test(uid=1001,gid=1001),映射成服務(wù)端的test,正常讀寫(xiě);
- 客戶端當(dāng)前用戶為user1(uid=1001,gid=1001),映射成服務(wù)端的test,正常讀寫(xiě);
- 客戶端當(dāng)前用戶為rancher(uid=1000,gid=1000),映射成服務(wù)端的rancher,只能讀不能寫(xiě);
- 客戶端當(dāng)前用戶為user2(uid=2000,gid=2000),映射成服務(wù)端的nfsnobody(uid=1001,gid=1001),正常讀寫(xiě)
root_squash,all_squash
只有1種情況:不管客戶端當(dāng)前用戶是什么,均映射成服務(wù)端的nfsnobody,只能讀不能寫(xiě)