Aspire 提供用于自定义应用程序部署方式的 API。 本文演示如何使用这些 API 配置特定于部署的设置,包括动态映像标记、资源配置和部署行为。
先决条件
- Aspire 9.5 或更高版本
- 现有 Aspire 项目
有关创建 Aspire 项目的信息,请参阅 生成第一个 Aspire 应用。
动态容器映像标记
使用此方法 WithDeploymentImageTag 在部署时动态生成容器映像标记。 这使得可以基于部署上下文、Git 提交记录、时间戳或外部系统制定灵活的版本控制策略。
Aspire将映像推送到为部署预配的远程容器注册表时,内置 Azure 部署器将使用部署映像标记。
基本用法
为资源配置静态或计算标记:
var builder = DistributedApplication.CreateBuilder(args);
// Static tag
var api = builder.AddProject<Projects.Api>("api")
.WithDeploymentImageTag(() => "v1.2.3-stable");
// Dynamic tag with timestamp
var worker = builder.AddProject<Projects.Worker>("worker")
.WithDeploymentImageTag(() => $"build-{DateTime.UtcNow:yyyyMMdd-HHmm}");
builder.Build().Run();
异步标记生成
对复杂的标记生成方案使用异步回调:
var service = builder.AddProject<Projects.Service>("service")
.WithDeploymentImageTag(async context =>
{
// Fetch version from external API
var buildInfo = await GetBuildInfoFromApi();
return $"service-{buildInfo.Version}";
});
使用事件驱动为所有资源应用标记
使用事件 API 自动将部署映像标记应用于应用程序中的所有资源。 如果想要在所有容器化资源之间进行一致的标记,此方法非常有用:
var builder = DistributedApplication.CreateBuilder(args);
// Subscribe to the BeforeStartEvent to configure all resources
builder.Eventing.Subscribe<BeforeStartEvent>(async (evt, ct) =>
{
var timestamp = DateTime.UtcNow.ToString("yyyyMMdd-HHmmss");
foreach (var resource in evt.Model.Resources)
{
builder.CreateResourceBuilder(resource).WithDeploymentImageTag((context) =>
{
var resourceName = resource.Name.ToLowerInvariant();
return $"{resourceName}-{timestamp}";
});
}
});
builder.Build().Run();
自定义 Azure Bicep 资源
使用 ConfigureInfrastructure 方法自定义在部署期间 Azure 生成的基础的 Aspire Bicep 模板。 这允许修改 Azure 资源属性、添加自定义配置或与现有 Azure 基础结构集成。
基本基础结构自定义
自定义Azure资源的 Bicep 属性。
var builder = DistributedApplication.CreateBuilder(args);
// Customize Azure Service Bus configuration
var serviceBus = builder.AddAzureServiceBus("servicebus");
serviceBus.AddServiceBusQueue("queue1");
serviceBus.ConfigureInfrastructure(infrastructure =>
{
var queue = infrastructure.GetProvisionableResources().OfType<ServiceBusQueue>().Single(q => q.BicepIdentifier == "queue1");
queue.MaxDeliveryCount = 5;
queue.LockDuration = TimeSpan.FromMinutes(5);
});