Azure-docs: 共享文件的访问权限

创建于 2018-10-09  ·  29评论  ·  资料来源: MicrosoftDocs/azure-docs

我已经用 grafana 在https://docs.microsoft.com/en-us/azure/container-instances/container-instances-volume-azure-files上尝试了这个工作流程

az container create --resource-group- 名称--image grafana/ grafana:最新的--dns-name-label--ports 3000 --azure-file-volume-account-name $STORAGE_ACCOUNT --azure-file-volume-account-key $STORAGE_KEY --azure-file-volume-share-name $ACI_PERS_SHARE_NAME --azure-file-volume -mount-path /var/lib/grafana --cpu 1 --memory 1

容器不断重启——可能是由于 grafana 无法更新持久共享上的文件。 如何确保在共享上正确设置访问权限? 我可以使用文件共享上设置的策略进行连接吗?


文件详情

不要编辑此部分。

Pri2 assigned-to-author container-instancesvc doc-enhancement triaged

最有用的评论

Microsoft,请修复已安装的 Fileshare 存储需要容器以 root 身份运行的事实,因为这违反了 docker 最佳实践。 此外,它消除了许多不以 root 身份运行且需要文件存储的容器。

我认为 Grafana 的根本问题是 docker 映像没有以 root 身份运行。

文件共享似乎挂载为root:root 777。这是默认设置。

当 Grafana 用户尝试访问挂载的存储时,它会失败。 您也不能 CHOWN 已安装的存储,我已将用户升级回 ROOT 并在 init.sh scipt 中尝试将权限分配给 Grafana 用户。 没有运气。

您在 ACI 容器内也没有足够的权限来挂载任何其他文件共享,cifs 挂载失败。

建议的解决方案:浮动指定装载选项的能力,与 Azure AKS 中的相同。
在 Kubernetes / AKS 中,您可以挂载 Azure 文件共享,但您可以指定挂载选项,例如 GID、UID 和默认权限。

所有29条评论

感谢您的反馈! 我们目前正在调查,并会尽快更新您。

@gs9824你能提供更多关于 grafana 的信息吗? 我不熟悉这项服务。

@MicahMcKittrick-MSFT,Grafana 是一种通过仪表板可视化来自不同来源的数据的工具。 将 Grafana 作为 docker 容器运行的问题是重新启动 docker 容器时不保留设置。
解决方案是将配置存储在持久存储中,以便重新启动不会导致配置丢失。
我尝试为此使用 Azure 文件共享并将其安装在容器 (/var/lib/grafana) 中。 这样配置就被持久化了。
似乎 Grafana 可以在该存储中创建文件(我可以通过存储资源管理器看到),但似乎无法更新任何文件

t=2018-10-09T14:20:36+0000 lvl=eror msg=“服务器关闭” logger=server reason=“服务初始化失败:迁移失败 err:数据库被锁定”

数据库存储在文件共享中。

在文件共享上,可以为用户创建访问权限,但我看不到如何在容器创建命令中指定这些权限。

@gs9824您是否考虑过将永久性磁盘与 AKS 一起使用?

https://docs.microsoft.com/en-us/azure/aks/azure-disks-dynamic-pv

@gs9824 对此有何更新?

@MicahMcKittrick-MSFT,抱歉还没有。 我首先尝试通过在容器创建期间执行一些 chmod 命令来使文件共享正常工作。 到目前为止没有运气。

@MicahMcKittrick-MSFT 据我了解,这将涉及建立一个完整的 AKS 集群。 我只是想将 Grafana 作为一个简单的 Azure 容器实例运行,而不需要修改容器中的任何内容。

@seanmck。 @iainfoulds你们中的任何一个对此有什么想法吗?

@gs9824仅供参考,我正在离线工作以获得答案。 一旦我有更多信息,我会更新你。

@gs9824因为这是一个长时间运行的实例并且看到很多重启,你可能只需要在az container create命令中添加一个长时间运行的命令行,比如 --command-line "tail - f /dev/null”。

此外,请查看本指南以获取其他故障排除选项

https://docs.microsoft.com/en-us/azure/container-instances/container-instances-troubleshooting#container -continually-exits-and-restarts-no-long-running-process

@gs9824 对此有何更新?

你好呀

巧合的是,对于完全相同的用例(Grafana),我遇到了完全相同的问题。

Grafana 记录以下错误:
lvl=eror msg="Server shutdown" logger=server reason="Service init failed: Migration failed err: database is locked"
结果,容器终止。
--command-line "tail -f /dev/null"对我来说只是阻止显示日志,但 grafana 仍然没有启动并且容器终止。

在不将 grafana 指向挂载的情况下开始,它将使用一个本地文件夹,它可以工作。 然后,在 Azure 门户上,我尝试手动在挂载上写入文件夹和文件,这可以正常工作。

这是一个 ARM 模板,因此您可以重现该问题。 只需替换我添加的一些占位符,您就可以开始使用了。

{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "SOME_CONTAINER_GROUP_NAME": { "defaultValue": "CONTAINER_GROUP_NAME", "type": "String" } }, "variables": {}, "resources": [{ "comments": "Generalized from resource: '/subscriptions/SUBSCRIPTION_ID/resourceGroups/grafana-test/providers/Microsoft.ContainerInstance/containerGroups/CONTAINER_GROUP_NAME'.", "type": "Microsoft.ContainerInstance/containerGroups", "name": "[parameters('SOME_CONTAINER_GROUP_NAME')]", "apiVersion": "2018-04-01", "location": "westeurope", "scale": null, "properties": { "containers": [{ "name": "[parameters('SOME_CONTAINER_GROUP_NAME')]", "properties": { "image": "grafana/grafana", "command": [], "ports": [{ "protocol": "TCP", "port": 3000 },{ "protocol": "TCP", "port": 80 } ], "environmentVariables": [{ "name": "GF_INSTALL_PLUGINS", "value": "grafana-azure-monitor-datasource" },{ "name": "GF_PATHS_DATA", "value": "/mnt/grafana" } ], "resources": { "requests": { "memoryInGB": 1.5, "cpu": 1 } }, "volumeMounts": [{ "name": "grafana-storage", "mountPath": "/mnt/grafana", "readOnly": false } ] } } ], "volumes": [{ "name": "grafana-storage", "azureFile": { "shareName": "grafana-test", "readOnly": false, "storageAccountName": "SOMESTORAGE_ACCOUNT", "storageAccountKey": "SOMESTORAGE_KEY" } } ], "restartPolicy": "Always", "ipAddress": { "ports": [{ "protocol": "TCP", "port": 3000 },{ "protocol": "TCP", "port": 80 } ], "type": "Public" }, "osType": "Linux" }, "dependsOn": [] } ] }

@MicahMcKittrick-MSFT 很抱歉没有早点回复——很高兴知道我不是唯一一个有这个问题的人:)。 同时,我在 VM 上运行 Grafana 作为一种解决方法(通过 Market place - Grafana Labs 的 Grafana 安装)。 重启很可能是因为 grafana 无法启动,因为数据库被锁定为@ore​​ndin状态。

感谢大家提供额外的细节。

我不确定这是否是我们可以包含在此文档中的信息,但无论如何,我将分配给作者进行审查,看看我们是否可以添加任何细节。

你好,这次我和prometheus有同样的问题。

同样的情况下,我正在使用 prometheus 映像创建一个安装有文件共享的 ACI。

我做了什么:脚本开始

echo" parameters"
ACI_PERS_RESOURCE_GROUP=ftp-group-container
ACI_PERS_LOCATION=some_location
ACI_PERS_SHARE_NAME=some_share

echo" Create the storage account with the parameters "
az storage account create \
--resource-group $ACI_PERS_RESOURCE_GROUP \
--name $ACI_PERS_STORAGE_ACCOUNT_NAME \
--location $ACI_PERS_LOCATION \
--sku Standard_LRS

echo " create file share"
az storage share create --name $ACI_PERS_SHARE_NAME --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME

echo" get the storage key " STORAGE_KEY=$(az storage account keys list --resource-group $ACI_PERS_RESOURCE_GROUP --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME --query "[0].value" --output tsv)
echo "storage key : "$STORAGE_KEY

echo" create a container instance "
az container create -g some-container-group \
--name prometheus-instance \
--image prom/prometheus \
--restart-policy OnFailure \
--ports 9090 \
--dns-name-label some-label \
--ip-address public \
--azure-file-volume-account-name $ACI_PERS_STORAGE_ACCOUNT_NAME \
--azure-file-volume-account-key $STORAGE_KEY \
--azure-file-volume-share-name $ACI_PERS_SHARE_NAME \
--azure-file-volume-mount-path /etc/prometheus/

脚本结束

我在共享文件“prometheus.yml”中添加了一个 YAML 文件

我所期望的

我希望 ACI 启动并读取我在共享文件上创建的 YAML 文件,因为我在其上安装了 /etc/prometheus

到底发生了什么

ACI 无法停止重新启动,因为它需要从“/etc/prometheus/prometheus.yml”获取配置并且错误是
err="error loading config from \"/etc/prometheus/prometheus.yml\": couldn't load configuration (--config.file=\"/etc/prometheus/prometheus.yml\"): open /etc/prometheus/prometheus.yml: permission denied

我试图做什么

我设法对文件系统进行 bash 访问以添加我自己的权限,
drwx------ 2 root root 0 Nov 15 21:33 prometheus.yml
chmod a+rwx prometheus.yml
drwx------ 2 root root 0 Nov 15 21:34 prometheus.yml

正如您所看到的,即使在文件上使用 chmod 作为根,我也无法更改权限。 所以可能这就是我无法让 ACI 读取 YAML conf 文件的原因

谢谢你的帮助。

嗨,大家好,
我解决了我的问题。

缺少什么

az storage share policy create --help

我做了什么

我添加了一个包含所需所有权限(读写列表)的共享策略,并且它有效。
我不再有 ACI 的权限问题

希望这会有所帮助

嘿,
在将 neo4j 映像部署为容器实例时,我遇到了同样的问题。
感谢上述所有工作。 都试过了。
问题

  • 我有一个文件共享,为同一资源组中的容器创建。 文件共享必须作为永久磁盘挂载到容器中。
  • 正如预期的那样,文件共享已挂载,但无法读取数据。
  • 访问权限问题。
    image
    image
    image

_参考文献_

{
    "....": [],
    "properties": {
        "containers": [
            {
                "....": [],
                "environmentVariables": [],
                "resources": {
                    "requests": {
                        "memoryInGB": 4,
                        "cpu": 1
                    }
                },
                "volumeMounts": [
                    {
                        "name": "data",
                        "mountPath": "/var/lib/neo4j/data/"
                    }
                ]
            }
        ]
    },
    "....": [],
    "volumes": [
        {
            "name": "data",
            "azureFile": {
                "shareName": "neo4jfiles",
                "storageAccountName": "neo4jcontainerstorage",
                "storageAccountKey": "<I-REVEALED-MY-SECRET-KEY>"
            }
        }
    ],
    "....": []
}

原始问题似乎已解决。 如果您有意见,请添加@dkkapur 。 谢谢。

有没有人为 Grafana 解决了这个问题? 不幸的是,我仍然得到错误

„lvl=eror msg="Server shutdown" logger=server reason="Service init failed: Migration failed err: database is locked"

我已经创建了一个具有所有权限的“访问策略”,但我不知道在安装卷时是否必须以某种方式指定它

"resources": [
    {
      "apiVersion": "2018-10-01",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "location": "[parameters('location')]",
      "name": "[parameters('containerName')]",
      "properties": {
        "containers": [
          {
            "name": "[parameters('containerName')]",
            "properties": {
              "image": "[parameters('imageName')]",
              "ports": "[parameters('ports')]",
              "environmentVariables": [
                {
                  "name": "GF_PATHS_DATA",
                  "value": "/mnt/grafana/data"
                },
                {
                  "name": "GF_PATHS_LOGS",
                  "value": "/mnt/grafana/logs"
                },
                {
                  "name": "GF_DASHBOARDS_PATH",
                  "value": "/mnt/grafana/dashboards"
                }
              ],
              "volumeMounts": [
                {
                  "name": "grafana-storage",
                  "mountPath": "/mnt/grafana",
                  "readOnly": false
                }
              ],
              "resources": {
                "requests": {
                  "cpu": "[int(parameters('numberCpuCores'))]",
                  "memoryInGB": "[float(parameters('memory'))]"
                }
              }
            }
          }
        ],
        "volumes": [
          {
            "name": "grafana-storage",
            "azureFile": {
              "shareName": "grafana",
              "readOnly": false,
              "storageAccountName": "_NAME_",
              "storageAccountKey": "_ACCESS_KEY_"
            }
          }
        ],
        "restartPolicy": "[parameters('restartPolicy')]",
        "osType": "[parameters('osType')]",
        "ipAddress": {
          "type": "[parameters('ipAddressType')]",
          "ports": "[parameters('ports')]",
          "dnsNameLabel": "[parameters('dnsNameLabel')]"
        }
      },
      "tags": {}
    }
  ]

Microsoft,请修复已安装的 Fileshare 存储需要容器以 root 身份运行的事实,因为这违反了 docker 最佳实践。 此外,它消除了许多不以 root 身份运行且需要文件存储的容器。

我认为 Grafana 的根本问题是 docker 映像没有以 root 身份运行。

文件共享似乎挂载为root:root 777。这是默认设置。

当 Grafana 用户尝试访问挂载的存储时,它会失败。 您也不能 CHOWN 已安装的存储,我已将用户升级回 ROOT 并在 init.sh scipt 中尝试将权限分配给 Grafana 用户。 没有运气。

您在 ACI 容器内也没有足够的权限来挂载任何其他文件共享,cifs 挂载失败。

建议的解决方案:浮动指定装载选项的能力,与 Azure AKS 中的相同。
在 Kubernetes / AKS 中,您可以挂载 Azure 文件共享,但您可以指定挂载选项,例如 GID、UID 和默认权限。

@dlepow @dkkapur关于这个话题有什么新闻吗?

分配给 Deep 进行跟进。 谢谢!

分配:@dkkapur

@dkkapur 有什么更新吗?

嘿,伙计们!
最后我发现了这个问题……花了 10 个小时试图解决问题

有什么消息吗? 看起来像是一年多以前分配的,但没有答案

标准 Postgresql Docker 映像也会发生同样的情况 - 如果您尝试通过挂载文件共享来使数据库持久化,它不会启动。

@MicahMcKittrick-MSFT 嘿,Micah,这有什么更新吗?

@dkkapur是否有任何计划允许 ACI 容器使用以下 AKS 等选项安装 azure 文件共享?

安装选项:
- 目录模式=0777
- 文件模式=0777
- uid=1000
- gid=1000
- mfsymlinks
- 诺布尔
- 缓存=无

我认为 Grafana 的根本问题是 docker 映像没有以 root 身份运行。

确切地。 它使用一个名为grafana的有限权限用户(如果没有故意更改)。

这个问题基本上阻止了生产中的任何持久存储绑定,因为我们不能依赖 docker 容器的健康状况,这正是我们首先使用 Docker 容器的原因。 是否有任何我们可以附加到的非提升用户启用存储?

你好,
这事有进一步更新吗 ?

我在一个 postgreSQL 容器上遇到了同样的问题,我想在 /var/lib/postgresql/data 上挂载一个文件共享以跨多个容器版本持久保存一个小型数据库,但该数据库没有权限使用monted文件共享。

以下是 Azure 容器实例上输出的日志:

The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 20
selecting default shared_buffers ... 400kB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
2020-08-28 07:12:06.201 UTC [83] FATAL:  data directory "/var/lib/postgresql/data" has wrong ownership
2020-08-28 07:12:06.201 UTC [83] HINT:  The server must be started by the user that owns the data directory.
child process exited with exit code 1
initdb: removing contents of data directory "/var/lib/postgresql/data"
running bootstrap script ...

然后容器停止。

我对将容器部署到天蓝色也很陌生,所以如果这不是预期的方法,我会很高兴学习新的东西。
(PS:我刚刚注意到alessiostalla已经提到这也会影响 postgreSQL 图像)

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Ponant picture Ponant  ·  3评论

bdcoder2 picture bdcoder2  ·  3评论

JeffLoo-ong picture JeffLoo-ong  ·  3评论

JamesDLD picture JamesDLD  ·  3评论

jharbieh picture jharbieh  ·  3评论