我使用docker在Azure Kubernetes上部署了Laravel应用程序。每当我尝试上传文件时,我的应用程序都无法上传文件,我从Laravel收到此错误(仅显示stacktrace的一部分):

但是在我的Dockerfile中,我“阻塞”了存储文件夹:

RUN chown -R www-data:www-data \
    /var/www/my-app/storage \
    /var/www/my-app/bootstrap/cache
我应该提到该文件已上传,但由于chmod异常而无法继续其余代码。
为了调试该问题,我运行了kubectl exec以将 shell 放入Pod,默认情况下,它以root用户身份登录。我将cd更改为上载的文件,然后尝试通过运行chmod 420 nameOfFile.ext以root身份更改权限,该方法可以正常工作,因此我将其更改回权限777。但是,由于Laravel使用的是apache用户“www-data”,因此我运行su www-data -s /bin/bash然后尝试更改通过运行chmod 420 nameOfFile.ext获得相同文件的权限,并且出现以下错误:

因此,我想知道chown中的“-R”是否仅适用于直接属于子文件或文件夹的文件和文件夹。因此,我切换回了root用户“chown”文件直接位于的文件夹,然后切换回www-data用户并尝试在文件上运行chmod,但仍然遇到相同的错误。
[编辑]
我还应该提到该应用程序将Azure文件服务用作持久卷。将其更改为Blob服务会有所帮助吗?
[编辑]
这是我完整的Dockerfile的样子:https://pastebin.com/zLSyfqK8
我在这个问题上已经有一段时间了,感谢您的帮助。让我知道您是否需要其他必要信息。

最佳答案



那就是问题所在。 Azure文件提供CIFS共享,该共享在Linux下作为cifs挂载安装。 CIFS共享不提供UNIX类型的文件权限和UNIX类型的uid / gid存储。

挂载CIFS共享时,Linux计算机使用用户名/密码在CIFS服务器上进行身份验证。不管哪个UNIX用户正在启动文件系统操作,通过此装载进行的每次访问实际上都会在CIFS服务器上使用该用户名。根据this GitHub issue的说明,Azure Files不支持UNIX扩展,这意味着Linux客户端将必须模拟UNIX uid / gid和权限。服务器不存储或提供这些参数。因此,在安装时,您必须添加uidgidfile_modedir_mode参数来设置这些数据。

如果您正在使用OS级CIFS挂载(通过/etc/fstab)或手动CLI挂载命令,则必须将这些选项添加到mount命令中(请参阅man mount.cifs)。

例如:mount -t cifs -o file_mode=0644,dir_mode=0755,uid=80,gid=80 ...
如果使用Kubernetes卷,则必须将这些选项添加到卷参数中(请参阅Azure Files share in Kubernetes)。

例如:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: azurefile
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  storageClassName: azurefile
  azureFile:
    secretName: azure-secret
    shareName: aksshare
    readOnly: false
  mountOptions:
  - dir_mode=0755
  - file_mode=0644
  - uid=80
  - gid=80
  - mfsymlinks

关于laravel - Docker Apache: 'chmod: changing permissions of “file”不允许操作',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60620423/

10-09 03:40