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 一致即可。