Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

file_put_contents(/xxx/config/.config.json): failed to open stream: Permission denied #44

Open
ncepuwanghui opened this issue May 8, 2020 · 5 comments

Comments

@ncepuwanghui
Copy link

ncepuwanghui commented May 8, 2020

docker 部署nginx+php-fpm时,打开dashboard出现”file_put_contents(/xxx/config/.config.json): failed to open stream: Permission denied“,无法保存配置,点击保存无响应。
image

image

docker run -d --name php -p 9000:9000 -v ~/PicUploader:/www/picuploader php:7.4.5-fpm-alpine3.11

docker run -d --name nginx -p 80:80 -p 443:443 -v ~/nginx/conf.d:/etc/nginx/conf.d -v ~/PicUploader:/www/picuploader nginx:1.17.9-alpine

docker run加了--privileged=true参数也不行

@xiebruce
Copy link
Owner

xiebruce commented May 8, 2020

权限问题,请保持以下三个相同,就没问题了

  • 1.php-fpm运行用户和组
  • 2.nginx运行用户和组
  • 3.PicUploader所属用户和组

@ncepuwanghui
Copy link
Author

ncepuwanghui commented May 9, 2020

权限问题,请保持以下三个相同,就没问题了

  • 1.php-fpm运行用户和组
  • 2.nginx运行用户和组
  • 3.PicUploader所属用户和组

@xiebruce 再请教下,docker容器内运行时,每个容器的用户和组都是各自容器内的,例如php-fpm是容器php的用户组www-data,nginx是容器nginx的用户组nginx,PicUploader是宿主机的用户组为apprun,这三个感觉没法统一,有其他方法吗

@xiebruce
Copy link
Owner

xiebruce commented May 9, 2020

@ncepuwanghui php-fpm和nginx都是可以修改配置文件来修改运行的用户和组的,把php-fpm和nginx的运行用户组修改成PicUploader所属用户组,即apprun,再重启php-fpm和nginx即可。

docker的php-fpm的运行用户组是在/usr/local/etc/php-fpm.d/www.conf中设置(默认用户和组都是www-data)
image

docker的nginx的运行用户组是在/etc/nginx/nginx.conf中设置的,它这里只设置了用户,但其实是可以这么设置的user 用户名 组名(比如:user www www,注意它中间是空格而不是冒号)
image

而宿主机的PicUploader所属用户和组都是apprun,这应该是你给的一个用户了吧,如果是远程服务器那就算了,如果是本地电脑是macOS或Linux我不建议用这个权限(windows无所谓),如果是本地电脑是macOS或Linux,建议把这个用户和组设置为你平时电脑平时使用的用户和组,这样你修改文件也方便,不用老是用root权限改。就算是远程服务器,一般也习惯用www:www作为用户和组,或者用php-fpm默认的www-data也行,当然什么用户都无所谓,只不过是一个通用习惯罢了。

@ncepuwanghui
Copy link
Author

@xiebruce 我试了好像不行,因为容器内的用户和组是容器镜像中的/etc/passwd和/etc/group,不是宿主机的/etc/passwd,可以基于官方镜像在自定义Dockfile中使用useradd增加用户,但也只能保证名字一样,uid和gid是不同的。

@xiebruce
Copy link
Owner

xiebruce commented May 9, 2020

@ncepuwanghui 那你看看宿主机的用户的uid和gid,然后在容器里删掉已存在的用户和组,再重新创建,先创建组,并且在创建时指定gid为宿主机PicUploader所属组的gid,然后再创建用户,并指定用户id为宿主机PicUploader所属用户的uid,指定所属组的gid为宿主机PicUploader所属组的gid,这样应该是可以的。

先在外部宿主机查看apprun用户的uid和gid,假设uid=1001和gid=1001

id apprun

然后在容器里创建组,注意用-g 1001指定这个组的id为前面获取到的apprun组的id

groupadd -g 1001 apprun

然后再在容器里创建用户(使用-u 1001指定该用户的uid,使用-g apprun指定该用户所属组(这里不用gid的原因是前面已经指定apprun组的gid了,所以可以直接用组名),最后一个apprun表示要创建的用户名)

useradd -u 1001 -g apprun apprun

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants