Docker 記一次容器內部修改宿主機掛載目錄用戶權限后宿主機目錄變化
一、需求:
因公司需求,需制作mysql5.7.22 docker基礎鏡像,每個項目以此鏡像啟動一個數據庫容器,並且每個項目掛載一個宿主機目錄到鏡像中數據存儲下面用於數據持久化保存以便后期遷移至阿里雲。
二、遇到問題
將宿主機中相應項目的目錄掛載到容器后需要將容器中此目錄的用戶權限修改為mysql:mysql,但是修改權限后宿主機相應目錄權限卻由開始的root變成宿主機用戶中的hrz。
啟動命令如下:
docker run -it -d --name mysql_test -v /Registry/test_mysql/:/application centos:7 /bin/bash
在容器中給予容器/application/mysql3308權限時命令如下:
chown -R mysql:mysql /application/mysql3308
三、根因
經過接近一天的時間,終於發現根因如下。
1、其實在操作系統中,真正決定用戶和用戶組的東西並不是用戶名和組名,而是相應的用戶id 和 對應的組id,當我們剛創建用戶時系統就會給用戶分配對應的用戶id 和 組id,默認創建的用戶和組id會從1000開始分配,可以在/etc/passwd中查看,如下圖
2、在遇到的問題描述中,因為容器中只創建了一個mysql用戶和組,因此容器中查看到mysql用戶id和組id為1000:1000,因此給/application/mysql3306目錄用戶權限時其實是給予的用戶id和組id為1000:1000權限,因此,在宿主機中mysql3306此目錄的用戶權限也變為1000:1000,因為宿主機中此用戶id和組id為hrz,因此就顯示為hrz,就算宿主機中也創建一mysql賬戶如果用戶id 和 組id 不為1000那么此目錄任然會是hrz。
3、但是要啟動mysql服務那么此目錄又必須在容器和宿主機中都為mysql用戶(具體原因為mysql配置文件中指定用戶為mysql),因此,解決方法為修改基礎鏡像中用戶mysql的用戶id和組id 與 宿主機中mysql的用戶id 與 組 id 一致即可。