xiebruce / PicUploader

一个还不错的图床工具,支持Mac/Win/Linux服务器、支持压缩后上传、添加图片或文字水印、多文件同时上传、同时上传到多个云、右击任意文件上传、快捷键上传剪贴板截图、Web版上传、支持作为Mweb/Typora发布图片接口、作为PicGo/ShareX/uPic等的自定义图床,支持在服务器上部署作为图床接口,支持上传任意格式文件。
https://www.xiebruce.top/17.html
MIT License
1.19k stars 169 forks source link

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

Open ncepuwanghui opened 4 years ago

ncepuwanghui commented 4 years ago

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 commented 4 years ago

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

ncepuwanghui commented 4 years ago

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

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

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

xiebruce commented 4 years ago

@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 commented 4 years ago

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

xiebruce commented 4 years ago

@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