Docker 上 Laravel 的文件权限 - 无法编辑文件
Posted
技术标签:
【中文标题】Docker 上 Laravel 的文件权限 - 无法编辑文件【英文标题】:File permissions with Laravel on Docker - can't edit file 【发布时间】:2019-07-18 04:03:12 【问题描述】:我正在 Docker 上运行全新安装的 Laravel。
当我运行容器并尝试从浏览器访问 laravel 应用程序时,我收到 Laravel 在屏幕上抛出的文件权限错误
UnexpectedValueException
The stream or file "/var/www/html/storage/logs/laravel-2019-02-24.log" could not be opened: failed to open stream: Permission denied
因此,如果我在运行容器 sudo chown www-data:www-data -R /var/www/html/
中执行此操作并将文件的所有权切换到 www-data
用户,则错误消失了,我可以按预期看到默认页面。问题是我无法编写/编辑应用程序的任何文件并在代码库中进行更改。
如果我从本地终端sudo chown -R lykos:lykos ./application // the folder that my laravel app lives in
(即不通过正在运行的容器)我可以编辑文件,但文件权限错误再次显示。
我该如何解决这个问题?顺便说一句,我在 Linux 上,所以我认为 windows 或 mac 用户不会发生此错误。另外我想尽量避免使用常见的chmod 777
解决方案,因为它不推荐作为适当的解决方案
【问题讨论】:
【参考方案1】:您需要做的就是从主机本身更改挂载目录的权限,例如,如果您在主机/home/lykos/laravel/data
上有以下目录,并且需要将其挂载到 docker 容器中,请遵循以下操作:
UID
和GID
例如,运行 laravel 你可能会发现 UID
和 GID
都带有
以下值1000
然后从主机运行以下
命令chown 1000:1000 /home/lykos/laravel/data
现在,laravel 应用程序应该能够在您使用它作为/home/lykos/laravel/data
目标的任何目录中进行写入,并确保在没有确认您拥有正确权限的情况下不要修改它,例如不要在其中手动创建另一个目录,除非您在创建后执行chown
。
上述解决方案适用于将用于写入该目录的用户,如果有其他用户需要确保给他们适当的权限,可能通过 linux acl 而不是使用世界权限 (777)
假设您有一个容器作为网络服务器,并且您需要在从本地主机开发时将应用程序托管在容器内。假设用于开发的 localhost 用户是 lykos
,而 Web 服务器使用的容器用户是 33
,对于 UID
和 GID
,您可以从 localhost 执行以下操作:
sudo chown 33:33 /home/lykos/laravel/data -R
sudo setfacl -Rm u:lykos:rwx,d:u:lykos:rwx /home/lykos/laravel/data
上述命令将使网络服务器能够访问和更新项目文件。并且还使您的本地主机能够修改当前文件和新创建的文件(请注意,如果您使用lykos
用户创建任何文件或目录,则需要使chown
匹配网络服务器uid)
【讨论】:
如果我做sudo chown lykos:lykos /home/lykos/my-laravel-app
,如果我做 ls -la 的所有权是lykos lykos
,我可以编辑文件。然后,如果我这样做 docker-compose run --rm app bash
和 ls -la 我有这个 1000 1000
如你所说。但是当我尝试从浏览器访问应用程序时,我收到文件权限错误。我在这里做错了吗?
可能是其他用户尝试访问文件,网络服务器是否使用 uid 等于 1000 的同一用户?
我如何检查这个?如果我切换到容器中的 www-data:www-data 错误不会显示,但也无法编辑文件
看来 www-data uid 不等于 1000。从容器中运行以下命令:id -u www-data
结果是什么?
如何添加执行以便列出文件? setfacl -Rm u:lykos:rwx /home/lykos/laravel/data
以上是关于Docker 上 Laravel 的文件权限 - 无法编辑文件的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 主机上的 docker 容器内更改挂载文件夹中的文件权限