使用 docker-compose 将 azure 文件共享挂载到 linux 容器的 Web 应用程序
mount azure file share to web app for linux containers with docker-compose
我正在尝试将 azure 文件共享 装载到 Web 应用程序容器 (linux) 服务。这是一个带有 angular 前端的 .net Core 3 Web api 应用程序。当我装载本地驱动器以加载与文件共享中完全相同的文件时,应用程序容器 运行 在本地完美运行。
根据 docker docs for azure file share 我应该将我的 docker 撰写文件设置为以下内容:
version: '3.4'
services:
webui:
image: ${DOCKER_REGISTRY-}webui
build:
context: .
dockerfile: src/WebUI/Dockerfile
environment:
- "UseInMemoryDatabase=false"
- "ASPNETCORE_ENVIRONMENT=Production"
- "ConnectionStrings__DefaultConnection=Server="
- "ASPNETCORE_Kestrel__Certificates__Default__Path=/security/mycertfile.pfx"
- "ASPNETCORE_Kestrel__Certificates__Default__Password=Your_password123"
ports:
- "5000:5000"
- "5001:5001"
volumes:
- mcpdata:"/security:/security"
restart: always
volumes:
mcpdata:
driver: azure_file
driver_opts:
share_name: sharename
storage_account_name: storageaccountname
在我的网络应用程序配置中,我创建了以下文件装载:
我可以确认文件共享包含环境变量中引用的文件:mcpdata/security/mycertfile.pfx
问题:
当容器被服务 运行 时,它给出一个错误:
System.InvalidOperationException: There was an error loading the certificate. The file '/security/mycert.pfx' was not found.
我厌倦了什么:
- 因为容器失败,我无法通过 ssh 进入它来检查文件。所以我从本地的 azure 容器注册表中提取图像,然后执行 docker export -o dump.tar 。然后我提取文件,但未创建安全文件夹。
- 我还尝试通过从 docker 撰写文件中删除顶级挂载定义来直接在 docker 撰写文件中引用命名文件共享。删除了如下所示的代码:
volumes:
mcpdata:
driver: azure_file
driver_opts:
share_name: sharename
storage_account_name: storageaccountname
问题:
谁能帮我将 azure 文件共享连接到我的容器,或者帮我确认当容器出现故障时文件挂载的位置。
编辑 1:
尝试使用 azure cli 添加文件共享装载。我使用以下命令将文件共享装载添加到我的网络应用程序:
az webapp config storage-account add --resource-group "rgname" --name "appname" --slot development --custom-id fsmount001 --storage-type AzureFiles --share-name "sname" --account-name "aname" --access-key "key" --mount-path /
此命令有效并创建了文件挂载,但是我仍然收到无法在 /security/ 文件夹中找到证书文件的错误
如果我 bash 通过 kudu 而不是容器本身进入应用程序,我可以看到文件挂载存在并且在 Web 应用程序的根目录中被命名为 security。
编辑 2:解决方案
使用以下命令设置文件挂载:
az webapp config storage-account add --resource-group "rgname" --name "appname" --slot development --custom-id fsmount001 --storage-type AzureFiles --share-name "sname" --account-name "aname" --access-key "key" --mount-path /security/security/
在 docker 中,我使用:
volumes:
- fsmount001: /security:/security
在appsettings.Production.json中:
"IdentityServer": {
"Key": {
"Type": "File",
"FilePath": "/security/mycert.pfx",
"Password": "password"
}
}
这是我的文件挂载设置在 Azure 门户中的配置 -> 路径映射下的样子:
在文件 mount 中有一个名为 security 的文件夹,其中包含证书文件。
感谢 Charles 的帮助,我希望这对其他人有帮助!
您所遵循的步骤是针对 ACI,而不是针对
网络应用程序。要将 Azure 文件共享挂载到容器的 Azure Web 应用程序,您只需按照 Link storage to your app.
中的步骤操作即可
并且您需要更改 volumes
处的 docker-compose 文件:
发件人:
volumes:
- mcpdata:"/security:/security"
进入:
volumes:
- custom-id:/security/security/
custom-id 是您在 CLI 命令中使用的内容。
我正在尝试将 azure 文件共享 装载到 Web 应用程序容器 (linux) 服务。这是一个带有 angular 前端的 .net Core 3 Web api 应用程序。当我装载本地驱动器以加载与文件共享中完全相同的文件时,应用程序容器 运行 在本地完美运行。
根据 docker docs for azure file share 我应该将我的 docker 撰写文件设置为以下内容:
version: '3.4'
services:
webui:
image: ${DOCKER_REGISTRY-}webui
build:
context: .
dockerfile: src/WebUI/Dockerfile
environment:
- "UseInMemoryDatabase=false"
- "ASPNETCORE_ENVIRONMENT=Production"
- "ConnectionStrings__DefaultConnection=Server="
- "ASPNETCORE_Kestrel__Certificates__Default__Path=/security/mycertfile.pfx"
- "ASPNETCORE_Kestrel__Certificates__Default__Password=Your_password123"
ports:
- "5000:5000"
- "5001:5001"
volumes:
- mcpdata:"/security:/security"
restart: always
volumes:
mcpdata:
driver: azure_file
driver_opts:
share_name: sharename
storage_account_name: storageaccountname
在我的网络应用程序配置中,我创建了以下文件装载:
我可以确认文件共享包含环境变量中引用的文件:mcpdata/security/mycertfile.pfx
问题:
当容器被服务 运行 时,它给出一个错误:
System.InvalidOperationException: There was an error loading the certificate. The file '/security/mycert.pfx' was not found.
我厌倦了什么:
- 因为容器失败,我无法通过 ssh 进入它来检查文件。所以我从本地的 azure 容器注册表中提取图像,然后执行 docker export -o dump.tar 。然后我提取文件,但未创建安全文件夹。
- 我还尝试通过从 docker 撰写文件中删除顶级挂载定义来直接在 docker 撰写文件中引用命名文件共享。删除了如下所示的代码:
volumes:
mcpdata:
driver: azure_file
driver_opts:
share_name: sharename
storage_account_name: storageaccountname
问题:
谁能帮我将 azure 文件共享连接到我的容器,或者帮我确认当容器出现故障时文件挂载的位置。
编辑 1:
尝试使用 azure cli 添加文件共享装载。我使用以下命令将文件共享装载添加到我的网络应用程序:
az webapp config storage-account add --resource-group "rgname" --name "appname" --slot development --custom-id fsmount001 --storage-type AzureFiles --share-name "sname" --account-name "aname" --access-key "key" --mount-path /
此命令有效并创建了文件挂载,但是我仍然收到无法在 /security/ 文件夹中找到证书文件的错误
如果我 bash 通过 kudu 而不是容器本身进入应用程序,我可以看到文件挂载存在并且在 Web 应用程序的根目录中被命名为 security。
编辑 2:解决方案
使用以下命令设置文件挂载:
az webapp config storage-account add --resource-group "rgname" --name "appname" --slot development --custom-id fsmount001 --storage-type AzureFiles --share-name "sname" --account-name "aname" --access-key "key" --mount-path /security/security/
在 docker 中,我使用:
volumes:
- fsmount001: /security:/security
在appsettings.Production.json中:
"IdentityServer": {
"Key": {
"Type": "File",
"FilePath": "/security/mycert.pfx",
"Password": "password"
}
}
这是我的文件挂载设置在 Azure 门户中的配置 -> 路径映射下的样子:
在文件 mount 中有一个名为 security 的文件夹,其中包含证书文件。
感谢 Charles 的帮助,我希望这对其他人有帮助!
您所遵循的步骤是针对 ACI,而不是针对 网络应用程序。要将 Azure 文件共享挂载到容器的 Azure Web 应用程序,您只需按照 Link storage to your app.
中的步骤操作即可并且您需要更改 volumes
处的 docker-compose 文件:
发件人:
volumes:
- mcpdata:"/security:/security"
进入:
volumes:
- custom-id:/security/security/
custom-id 是您在 CLI 命令中使用的内容。