You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:03:27