
!https://img.shields.io/docker/pulls/tnc1997/azure-app-configuration-emulator?link=https%3A%2F%2Fhub.docker.com%2Fr%2Ftnc1997%2Fazure-app-configuration-emulator !https://img.shields.io/docker/stars/tnc1997/azure-app-configuration-emulator?link=https%3A%2F%2Fhub.docker.com%2Fr%2Ftnc1997%2Fazure-app-configuration-emulator
请注意:Azure App Configuration模拟器是非官方的,且未获得微软认可。
shelldocker pull tnc1997/azure-app-configuration-emulator docker run -p 8080:8080 tnc1997/azure-app-configuration-emulator
模拟器支持HMAC认证和Microsoft Entra ID认证。
可通过环境变量Authentication__Schemes__Hmac__Credential和Authentication__Schemes__Hmac__Secret分别覆盖凭证和密钥。
yamlservices: azure-app-configuration-emulator: environment: - Authentication__Schemes__Hmac__Credential=xyz - Authentication__Schemes__Hmac__Secret=c2VjcmV0 image: tnc1997/azure-app-configuration-emulator
.NET
客户端可使用模拟器的连接字符串进行请求认证。
csharpusing Azure.Data.AppConfiguration; var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings__AzureAppConfiguration"); var client = new ConfigurationClient(connectionString); var setting = new ConfigurationSetting("AzureAppConfigurationEmulator", "Hello World"); await client.SetConfigurationSettingAsync(setting);
yamlservices: azure-app-configuration-emulator: image: tnc1997/azure-app-configuration-emulator console-application: build: context: . dockerfile: ./ConsoleApplication/Dockerfile depends_on: - azure-app-configuration-emulator environment: - ConnectionStrings__AzureAppConfiguration=Endpoint=http://azure-app-configuration-emulator:8080;Id=abcd;Secret=c2VjcmV0;
Postman
可使用以下脚本生成认证相关头信息:
javascriptconst credential = "abcd"; const secret = "c2VjcmV0"; const date = new Date().toUTCString(); const contentHash = CryptoJS.SHA256(CryptoJS.enc.Utf8.parse(pm.request.body.toString())).toString(CryptoJS.enc.Base64); const signedHeaders = "x-ms-date;Host;x-ms-content-sha256"; const stringToSign = `${pm.request.method}\n${pm.request.url.getPathWithQuery()}\n${date};${pm.request.url.getRemote()};${contentHash}`; const signature = CryptoJS.HmacSHA256(CryptoJS.enc.Utf8.parse(stringToSign), CryptoJS.enc.Base64.parse(secret)).toString(CryptoJS.enc.Base64); pm.request.headers.upsert(`x-ms-date: ${date}`); pm.request.headers.upsert(`x-ms-content-sha256: ${contentHash}`); pm.request.headers.upsert(`Authorization: HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`);
Microsoft Entra ID认证允许使用托管标识模拟基于Azure的生产环境。
https://github.com/nagyesta/assumed-identity%E6%98%AF%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E6%B5%8B%E8%AF%95%E6%9B%BF%E8%BA%AB%EF%BC%8C%E6%A8%A1%E6%8B%9FAzure%E5%AE%9E%E4%BE%8B%E5%85%83%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1(IMDS)%E5%A4%84%E7%90%86%E6%89%98%E7%AE%A1%E6%A0%87%E8%AF%86%E4%BB%A4%E7%89%8C%E7%9A%84%E6%96%B9%E5%BC%8F%E3%80%82
必须通过环境变量Authentication__Schemes__MicrosoftEntraId__MetadataAddress设置元数据地址。
yamlservices: assumed-identity: image: nagyesta/assumed-identity azure-app-configuration-emulator: depends_on: - assumed-identity environment: - ASPNETCORE_HTTP_PORTS=8080 - ASPNETCORE_HTTPS_PORTS=8081 - Authentication__Schemes__MicrosoftEntraId__MetadataAddress=http://assumed-identity/metadata/identity/.well-known/openid-configuration - Authentication__Schemes__MicrosoftEntraId__RequireHttpsMetadata=false - Kestrel__Certificates__Default__Path=/usr/local/share/azureappconfigurationemulator/emulator.crt - Kestrel__Certificates__Default__KeyPath=/usr/local/share/azureappconfigurationemulator/emulator.key image: tnc1997/azure-app-configuration-emulator volumes: - ./emulator.crt:/usr/local/share/azureappconfigurationemulator/emulator.crt:ro - ./emulator.key:/usr/local/share/azureappconfigurationemulator/emulator.key:ro
.NET
客户端可使用托管标识进行请求认证。
csharpusing Azure.Data.AppConfiguration; using Azure.Identity; var endpoint = Environment.GetEnvironmentVariable("Endpoints__AzureAppConfiguration"); var credential = new ManagedIdentityCredential(); var client = new ConfigurationClient(new Uri(endpoint), credential); var setting = new ConfigurationSetting("AzureAppConfigurationEmulator", "Hello World"); await client.SetConfigurationSettingAsync(setting);
yamlservices: assumed-identity: image: nagyesta/assumed-identity azure-app-configuration-emulator: depends_on: - assumed-identity environment: - ASPNETCORE_HTTP_PORTS=8080 - ASPNETCORE_HTTPS_PORTS=8081 - Authentication__Schemes__MicrosoftEntraId__MetadataAddress=http://assumed-identity/metadata/identity/.well-known/openid-configuration - Authentication__Schemes__MicrosoftEntraId__RequireHttpsMetadata=false - Kestrel__Certificates__Default__Path=/usr/local/share/azureappconfigurationemulator/emulator.crt - Kestrel__Certificates__Default__KeyPath=/usr/local/share/azureappconfigurationemulator/emulator.key image: tnc1997/azure-app-configuration-emulator volumes: - ./emulator.crt:/usr/local/share/azureappconfigurationemulator/emulator.crt:ro - ./emulator.key:/usr/local/share/azureappconfigurationemulator/emulator.key:ro console-application: build: context: . dockerfile: ./ConsoleApplication/Dockerfile depends_on: - assumed-identity - azure-app-configuration-emulator entrypoint: /bin/sh -c "update-ca-certificates && dotnet ConsoleApplication.dll" environment: - Endpoints__AzureAppConfiguration=https://azure-app-configuration-emulator:8081 volumes: - ./emulator.crt:/usr/local/share/ca-certificates/emulator.crt:ro
模拟器兼容以下操作:
| 操作 | |
|---|---|
| 获取 | ✔️ |
| 条件获取 | ✔️ |
| 选择字段获取 | ✔️ |
| 基于时间访问获取 | ✔️ |
| 列出 | ✔️ |
| 分页列出 | ❌ |
| 筛选列出 | ✔️ |
| 选择字段列出 | ✔️ |
| 基于时间访问列出 | ✔️ |
| 设置 | ✔️ |
| 条件设置 | ✔️ |
| 删除 | ✔️ |
| 条件删除 | ✔️ |
| 操作 | |
|---|---|
| 列出 | ✔️ |
| 分页列出 | ❌ |
| 筛选列出 | ✔️ |
| 选择字段列出 | ✔️ |
| 基于时间访问列出 | ✔️ |
| 操作 | |
|---|---|
| 列出 | ✔️ |
| 分页列出 | ❌ |
| 筛选列出 | ✔️ |
| 选择字段列出 | ✔️ |
| 基于时间访问列出 | ✔️ |
| 操作 | |
|---|---|
| 锁定 | ✔️ |
| 条件锁定 | ✔️ |
| 解锁 | ✔️ |
| 条件解锁 | ✔️ |
| 操作 | |
|---|---|
| 列出 | ❌ |
| 分页列出 | ❌ |
| 范围列出 | ❌ |
| 筛选列出 | ❌ |
| 选择字段列出 | ❌ |
| 基于时间访问列出 | ❌ |
模拟器使用SQLite数据库存储配置设置。
可通过卷实现会话间数据持久化:
yamlservices: azure-app-configuration-emulator: image: tnc1997/azure-app-configuration-emulator volumes: - azure-app-configuration-emulator:/var/lib/azureappconfigurationemulator volumes: azure-app-configuration-emulator:
可通过环境变量ConnectionStrings__DefaultConnection覆盖数据库连接字符串:
yamlservices: azure-app-configuration-emulator: environment: - ConnectionStrings__DefaultConnection=Data Source=/var/lib/azureappconfigurationemulator/emulator.db image: tnc1997/azure-app-configuration-emulator
可将预填充数据的数据库挂载到容器,但需确保数据库具有所需架构:
yamlservices: azure-app-configuration-emulator: image: tnc1997/azure-app-configuration-emulator volumes: - ./emulator.db:/var/lib/azureappconfigurationemulator/emulator.db
模拟器与Azure Event Grid集成,当配置设置被删除或修改时,使用Event Grid事件架构发布事件。
可通过环境变量Messaging__EventGridTopics__xyz__Endpoint和Messaging__EventGridTopics__xyz__Credential__Key分别设置Event Grid主题的端点和密钥,其中xyz为任意名称。
yamlservices: azure-app-configuration-emulator: environment: - Messaging__EventGridTopics__Contoso__Credential__Key=a2V5 - Messaging__EventGridTopics__Contoso__Endpoint=https://contoso.uksouth-1.eventgrid.azure.net/api/events image: tnc1997/azure-app-configuration-emulator
模拟器集成OpenTelemetry以提供指标和跟踪。
可通过环境变量OTEL_EXPORTER_OTLP_ENDPOINT覆盖OpenTelemetry协议(OTLP)导出器的端点:
yamlservices: azure-app-configuration-emulator: depends_on: - opentelemetry-collector environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://opentelemetry-collector:4317 image: tnc1997/azure-app-configuration-emulator opentelemetry-collector: image: otel/opentelemetry-collector-contrib
模拟器可配置为使用自签名证书通过HTTPS提供请求服务。
shellopenssl req -x509 -out ./emulator.crt -keyout ./emulator.key -newkey rsa:2048 -nodes -sha256 -subj '/CN=azure-app-configuration-emulator' -addext 'subjectAltName=DNS:azure-app-configuration-emulator'
必须通过环境变量ASPNETCORE_HTTPS_PORTS设置HTTPS端口。
必须通过环境变量Kestrel__Certificates__Default__Path和Kestrel__Certificates__Default__KeyPath分别设置证书和密钥的路径。
证书和密钥必须挂载到容器中上述设置的路径。
yamlservices: azure-app-configuration-emulator: environment: - ASPNETCORE_HTTP_PORTS=8080 - ASPNETCORE_HTTPS_PORTS=8081 - Kestrel__Certificates__Default__Path=/usr/local/share/azureappconfigurationemulator/emulator.crt - Kestrel__Certificates__Default__KeyPath=/usr/local/share/azureappconfigurationemulator/emulator.key image: tnc1997/azure-app-configuration-emulator volumes: - ./emulator.crt:/usr/local/share/azureappconfigurationemulator/emulator.crt:ro - ./emulator.key:/usr/local/share/azureappconfigurationemulator/emulator.key:ro
模拟器与Testcontainers集成,便于对使用Azure App Configuration的应用进行集成测试。
csharpvar container = new ContainerBuilder() .WithImage("tnc1997/azure-app-configuration-emulator:1.0") .WithPortBinding(8080, true) .WithWaitStrategy(Wait.ForUnixContainer().UntilMessageIsLogged("Now listening on")) .Build(); await container.StartAsync(); var client = new ConfigurationClient($"Endpoint={new UriBuilder(Uri.UriSchemeHttp, container.Hostname, container.GetMappedPublicPort(8080))};Id=abcd;Secret=c2VjcmV0"); await client.SetConfigurationSettingAsync(nameof(ConfigurationSetting.Key), nameof(ConfigurationSetting.Value)); var response = await client.GetConfigurationSettingAsync(nameof(ConfigurationSetting.Key));
即将推出 https://github.com/testcontainers/testcontainers-dotnet/issues/1198
csharpvar container = new AzureAppConfigurationBuilder().Build(); await container.StartAsync(); var client = new ConfigurationClient(container.GetConnectionString()); await client.SetConfigurationSettingAsync(nameof(ConfigurationSetting.Key), nameof(ConfigurationSetting.Value)); var response = await client.GetConfigurationSettingAsync(nameof(ConfigurationSetting.Key));
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务