Docker容器内用户与宿主机用户不匹配问题
打包了一个lnmp包,里面包含了Nginx和php服务。设置nginx和php用户为www-data,同时将代码挂载到容器下。
使用时,发现代码基本能正常运行,但生成缓存及图片上传时,都提示文件夹权限错误。
因为使用Thinkphp,框架运行时会生成缓存文件,图片上传时也需要生成存放路径。
总结来说,容器中php能够读取代码,但是写的权限不够。这很奇怪。
而且在不同服务器,表现不同。有一台服务器能够运行,另外一个却出现这个问题。
进入容器中查看,php和nginx中配置运行用户都是www-data,理论上应该是没有问题的。搜索了相关问题,仔细研究,才发现了问题所在。
发现问题
代码目录,所属用户www-data,同时设置php配置文件中用户使用www-data
正常时候能够运行,但是生成的runtime缓存文件,用户却不是www-data
缓存文件的所属用户为33,而用户组都是tape
,为啥会是这样的。
产生原因
产生上述问题的根源是,容器中用户和宿主机用户ID不同。
宿主机用户的ID
查看宿主机用户www-data的id,可以看到所属用户及组
1 | id www-data |
为uid=1000(www-data) gid=1000(www-data) groups=1000(www-data)
,可以看到用户ID为1000
容器用户ID
查看Docker容器中www-data用户ID
为uid=33(www-data) gid=33(www-data) groups=33(www-data)
查看用户用户组
1 | cat /etc/group |
可以看到tape的用户组又是33
所以虽然都是www-data用户,但容器中和宿主机却不同。
可能是打包时原Image中用户和现在docker用户不同。
多台服务器,表象不一样
多台服务器部署时,情况又不一样。
发现有些服务器能够正常使用。而最新部署的centos7的服务器却不能使用。
对比不同服务器的www-data
用户id,发现问题。
正常使用的宿主机,www-data
用户id为33
新部署centos7宿主机,www-data
用户id为1000。这正好能够结实上面的结论。
解决方案。
修改Dockerfile
文件,添加用户组。
或者在原镜像基础上,添加。
1 | FROM php:5.6-fpm |
–user参数
docker运行时,也可以使用–user参数,指定用户
1 | docker run --user=www-data |
相关参数 –privileged=true
使用该参数,container内的root拥有真正的root权限,可以看到宿主机上的设备,挂载。甚至允许你再docker容器中启动docker容器。
不使用该参数,容器中的root只是宿主机的一个普通用户权限。
参考文章
https://www.cnblogs.com/jackluo/p/5952953.html
http://www.360doc.com/content/15/0729/17/2149364_488187041.shtml