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 容器中,请遵循以下操作:

检查容器内的UIDGID 例如,运行 laravel 你可能会发现 UIDGID 都带有 以下值1000 然后从主机运行以下 命令chown 1000:1000 /home/lykos/laravel/data

现在,laravel 应用程序应该能够在您使用它作为/home/lykos/laravel/data 目标的任何目录中进行写入,并确保在没有确认您拥有正确权限的情况下不要修改它,例如不要在其中手动创建另一个目录,除非您在创建后执行chown

上述解决方案适用于将用于写入该目录的用户,如果有其他用户需要确保给他们适当的权限,可能通过 linux acl 而不是使用世界权限 (777)

假设您有一个容器作为网络服务器,并且您需要在从本地主机开发时将应用程序托管在容器内。假设用于开发的 localhost 用户是 lykos,而 Web 服务器使用的容器用户是 33,对于 UIDGID,您可以从 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 的文件权限 - 无法编辑文件的主要内容,如果未能解决你的问题,请参考以下文章

UNIX Laravel Artisan文件权限

Docker 容器上的文件权限

在 Windows 主机上的 docker 容器内更改挂载文件夹中的文件权限

已安装Docker并尝试使用权限拒绝消息创建新文件

phpunit 命令在 laravel 项目上给出权限被拒绝错误

使用docker搭建laravel记叙