【问题标题】:Django can't access Azure mounted storageDjango 无法访问 Azure 挂载的存储
【发布时间】:2019-01-27 21:26:27
【问题描述】:

我正在使用 AKS (kubernetes) 在 Azure 服务器上运行我的 Djagno 应用程序(python 2.7、django 1.11)。

我在 /data/media 上安装了一个持久存储卷。 当我尝试通过我的应用上传文件时,出现以下错误:

Exception Value: [Errno 13] Permission denied: '/data/media/uploads/<some_dir>'
Exception Location: /usr/local/lib/python2.7/os.py in makedirs, line 157

os.py 中的问题行是试图创建目录mkdir(name, mode) 的行。

当我使用 kubectl exec -it &lt;my-pod&gt; bash 访问 pod(用户是 root)时,我可以轻松地 cd 进入 /data/media 目录,创建子文件夹并在 Azure 门户中看到它们。所以我的坐骑很好。

我尝试了 chmoding /data/media 但这不起作用。似乎我无法更改已安装持久卷上文件夹的权限,也无法添加用户或更改组。因此,从我的 pod 访问卷似乎没有问题,但由于 Django 不是以 root 身份运行,它无法访问它。

我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: django linux python-2.7 azure django-1.11


    【解决方案1】:

    事实证明,由于 Azure 文件共享挂载实际上归 k8s 集群所有,因此运行在 pod 中的 Docker 容器仅将其挂载为入口点,但由于不拥有它,因此无法修改其权限。

    解释了它现在开始发生的原因here

    ...原来Kubernetes版本之间默认的目录模式和文件模式是不同的。因此,虽然 Kubernetes v1.6.x、v1.7.x 的访问模式是 0777,但 v1.8.6 或更高版本的访问模式是 0755

    所以对我来说,解决方法是将已安装卷的所需访问权限添加到 k8s 规范中,如下所示:

    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: <volumeName>
      annotations:
        volume.beta.kubernetes.io/storage-class: <className>
    spec:
      mountOptions:
        - dir_mode=0777
        - file_mode=0777
      accessModes:
        - ReadWriteMany
    ...
    

    ** 我写了0777作为例子。您应该仔细设置为您编写的内容。

    希望这对任何人都有帮助。

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多