如何在macOS的.NET Docker容器中使用Azure CLI凭据(无客户端密钥)
问题描述
我正在构建一个使用Azure App Configuration和Azure Key Vault引用的.NET 9 Web API。
本地开发中,我使用以下代码通过DefaultAzureCredential建立连接:
using Azure.Identity; namespace InventoryService { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { var settings = config.Build(); var connectionString = settings.GetConnectionString("AppConfig"); if (!string.IsNullOrEmpty(connectionString)) { config.AddAzureAppConfiguration(options => { options.Connect(connectionString) .ConfigureKeyVault(kv => { kv.SetCredential(new DefaultAzureCredential()); kv.SetSecretRefreshInterval(TimeSpan.FromHours(6)); }); }); } }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } }
我的appsettings.json包含AppConfig连接字符串:
{ "ConnectionStrings": { "AppConfig": "Endpoint=https://orderservice.azconfig.io;Id=Ux/8;Secret=xxx" } }
该AppConfig包含需要认证的Key Vault引用。
现状
- 无创建Azure服务主体的权限;
- 使用企业账户通过Azure CLI(
az login)本地登录; - 在Mac上本地运行应用(非Docker环境)时一切正常;
- 希望在Docker中构建并运行应用,同时复用当前
az login会话。
Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:9.0.203-alpine3.20 AS base RUN apk add --no-cache shadow && \ groupadd -g 1000 appuser && \ useradd -u 1000 -g appuser -m appuser && \ update-ca-certificates WORKDIR /app EXPOSE 8080 EXPOSE 8443 FROM base AS final USER appuser COPY --chown=appuser:appuser ./package/ . ENTRYPOINT ["dotnet", "InventoryService.dll"]
核心问题
如何运行此Docker容器,使其复用macOS上当前的az login会话,让DefaultAzureCredential能在容器内解析AzureCliCredential?
解决方案
要让Docker容器复用本地macOS的Azure CLI登录会话,需通过挂载配置目录+设置环境变量实现,具体步骤如下:
1. 运行容器时挂载Azure配置目录
macOS上Azure CLI的默认配置目录为~/.azure,包含登录会话缓存。使用以下命令启动容器:
docker run -d \ -v ~/.azure:/home/appuser/.azure \ -e AZURE_CONFIG_DIR=/home/appuser/.azure \ -p 8080:8080 \ -p 8443:8443 \ <你的镜像名称>
参数说明
-v ~/.azure:/home/appuser/.azure:将本地Azure配置目录挂载到容器内应用用户的主目录,让容器进程能访问登录会话;-e AZURE_CONFIG_DIR=/home/appuser/.azure:指定容器内Azure SDK/CLI的配置目录路径;-p:映射容器端口到本地,保持与Dockerfile暴露端口一致;<你的镜像名称>:替换为实际构建的Docker镜像名。
2. 可选:优化Dockerfile权限
为避免容器内appuser对挂载目录无访问权限,可在Dockerfile中提前创建目录并设置权限:
FROM mcr.microsoft.com/dotnet/sdk:9.0.203-alpine3.20 AS base RUN apk add --no-cache shadow && \ groupadd -g 1000 appuser && \ useradd -u 1000 -g appuser -m appuser && \ mkdir -p /home/appuser/.azure && \ chown appuser:appuser /home/appuser/.azure && \ update-ca-certificates WORKDIR /app EXPOSE 8080 EXPOSE 8443 FROM base AS final USER appuser COPY --chown=appuser:appuser ./package/ . ENTRYPOINT ["dotnet", "InventoryService.dll"]
3. 验证会话复用
容器启动后,可进入容器验证Azure会话有效性:
docker exec -it <容器ID> az account show
若能正常返回当前Azure账户信息,说明会话复用成功,此时.NET应用可通过DefaultAzureCredential自动使用该会话完成认证。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

