Docker容器内用户与宿主机用户不匹配问题

打包了一个lnmp包,里面包含了Nginx和php服务。设置nginx和php用户为www-data,同时将代码挂载到容器下。
使用时,发现代码基本能正常运行,但生成缓存及图片上传时,都提示文件夹权限错误。
因为使用Thinkphp,框架运行时会生成缓存文件,图片上传时也需要生成存放路径。

总结来说,容器中php能够读取代码,但是写的权限不够。这很奇怪。

而且在不同服务器,表现不同。有一台服务器能够运行,另外一个却出现这个问题。

进入容器中查看,php和nginx中配置运行用户都是www-data,理论上应该是没有问题的。搜索了相关问题,仔细研究,才发现了问题所在。

发现问题

代码目录,所属用户www-data,同时设置php配置文件中用户使用www-data

image-20210411000607724

正常时候能够运行,但是生成的runtime缓存文件,用户却不是www-data

image-20210410234331231

缓存文件的所属用户为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
2
FROM php:5.6-fpm
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

–user参数

docker运行时,也可以使用–user参数,指定用户

1
2
docker run  --user=www-data
#docker run --user=$(id -u)

相关参数 –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

https://www.cntofu.com/book/139/image/dockerfile/user.md

docker-compose php处理目录权限问题

螃蟹 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!