Laravel 对 Docker 的文件权限 - 无法编辑文件

File permissions with Laravel on Docker - can't edit file

我正在 运行 在 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

所以,如果我在 运行ning 容器 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(即不通过 运行ning 容器)我可以编辑文件,但文件权限错误再次显示。

我该如何解决这个问题?顺便说一句,我在 Linux,所以我认为 windows 或 mac 用户不会出现此错误。另外我想尽量避免常见的 chmod 777 解决方案,因为不建议将其作为正确的解决方案

您需要做的就是从主机本身更改挂载目录的权限,例如,如果您在主机 /home/lykos/laravel/data 上有以下目录,并且您需要将其挂载到 docker 容器遵循以下内容:

  • 检查用于制作的容器内的UIDGID 例如 laravel 运行ning 你可能会发现 UIDGID 以下值 1000 然后来自主机 运行 以下 命令 chown 1000:1000 /home/lykos/laravel/data

现在 laravel 应用程序应该能够在您将其用作 /home/lykos/laravel/data 的目标的任何目录中进行写入,并确保在未确认您拥有正确的目录之前不要修改它许可,例如不要在其中手动创建另一个目录,除非您在创建后 chown

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

假设您有一个容器作为网络服务器,您需要在从本地主机开发时将应用程序托管在容器内。假设用于开发的本地主机用户是 lykos 并且网络服务器使用的容器用户是 33 对于 UIDGID 你可以从你的本地主机:

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)