Skip to content

Azure Container App Jobs

Azure Container Apps environment logo

Azure Container Apps jobs enable you to run containerized tasks that execute for a finite duration and exit. You can use jobs to perform tasks such as data processing, machine learning, or any scenario where on-demand processing is required. Unlike traditional Azure Container Apps that run continuously, Container App Jobs are designed for batch processing, scheduled tasks, and event-driven workloads.

Aspire provides support for Azure Container App Jobs through the PublishAsAzureContainerAppJob extension method, allowing you to deploy your .NET projects, containers, and executables as jobs in Azure Container Apps.

  • Azure subscription.
  • Aspire project.
  • Understanding of Azure Container Apps jobs.

Aspire allows you to publish the following resource types as Azure Container App Jobs:

  • ContainerResource: Represents a specified container.
  • ExecutableResource: Represents a specified executable process.
  • ProjectResource: Represents a specified .NET project.

To publish resources as Azure Container App Jobs, use the following APIs:

  • PublishAsAzureContainerAppJob<T>(IResourceBuilder<T>);
  • PublishAsAzureContainerAppJob<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure, ContainerAppJob>);
  • PublishAsScheduledAzureContainerAppJob<T>(IResourceBuilder<T>, string, Action<AzureResourceInfrastructure, ContainerAppJob>);

The following example demonstrates how to configure a .NET project as an Azure Container App Job with a scheduled trigger:

C# — AppHost.cs
var builder = DistributedApplication.CreateBuilder();
builder.AddProject<Projects.DataProcessor>("data-processor")
.PublishAsScheduledAzureContainerAppJob("0 0 * * *"); // Every day at midnight

This code:

  • Creates a new distributed application builder.
  • Adds a project named data-processor to the builder.
  • Calls PublishAsScheduledAzureContainerAppJob to configure the project as a Container App Job.
  • Sets the trigger type to Schedule with a cron expression to run daily at midnight.

Azure Container App Jobs support different trigger types:

Use manual triggers for on-demand job execution:

C# — AppHost.cs
builder.AddProject<Projects.ManualTask>("manual-task")
.PublishAsAzureContainerAppJob((_, job) =>
{
job.Configuration.TriggerType = ContainerAppJobTriggerType.Manual;
});

Use schedule triggers for time-based job execution:

C# — AppHost.cs
builder.AddProject<Projects.ScheduledTask>("scheduled-task")
.PublishAsAzureContainerAppJob((_, job) =>
{
job.Configuration.TriggerType = ContainerAppJobTriggerType.Schedule;
job.Configuration.ScheduleTriggerConfig.CronExpression = "0 */6 * * *"; // Every 6 hours
job.Configuration.ScheduleTriggerConfig.Parallelism = 1;
job.Configuration.ScheduleTriggerConfig.ReplicaCompletionCount = 1;
});

Use event triggers for reactive job execution based on external events:

C# — AppHost.cs
builder.AddProject<Projects.EventDrivenTask>("event-task")
.PublishAsAzureContainerAppJob((_, job) =>
{
job.Configuration.TriggerType = ContainerAppJobTriggerType.Event;
job.Configuration.EventTriggerConfig.Scale.MinExecutions = 1;
job.Configuration.EventTriggerConfig.Scale.MaxExecutions = 10;
job.Configuration.EventTriggerConfig.Parallelism = 1;
job.Configuration.EventTriggerConfig.ReplicaCompletionCount = 1;
});

Configure CPU and memory resources for your job:

C# — AppHost.cs
builder.AddProject<Projects.ResourceIntensiveTask>("intensive-task")
.PublishAsAzureContainerAppJob((_, job) =>
{
job.Configuration.TriggerType = ContainerAppJobTriggerType.Manual;
job.Template.Containers[0].Value!.Resources.Cpu = 1.0;
job.Template.Containers[0].Value!.Resources.Memory = "2Gi";
});

Add environment variables to your job:

C# — AppHost.cs
var connectionString = builder.AddParameter("connectionString");
builder.AddProject<Projects.DatabaseTask>("db-task")
.PublishAsAzureContainerAppJob((infra, job) =>
{
job.Configuration.TriggerType = ContainerAppJobTriggerType.Manual;
job.Template.Containers[0].Value!.Env.Add(new ContainerAppEnvironmentVariable
{
Name = "ConnectionString",
Value = connectionString.AsProvisioningParameter(infra)
});
});

Configure job execution timeout and retry behavior:

C# — AppHost.cs
builder.AddProject<Projects.RetryableTask>("retryable-task")
.PublishAsAzureContainerAppJob((_, job) =>
{
job.Configuration.TriggerType = ContainerAppJobTriggerType.Manual;
job.Configuration.ReplicaTimeout = 1800; // 30 minutes
job.Configuration.ReplicaRetryLimit = 3;
});

You can also publish container resources as Azure Container App Jobs:

C# — AppHost.cs
builder.AddContainer("batch-processor", "myregistry.azurecr.io/batch-processor:latest")
.PublishAsAzureContainerAppJob((_, job) =>
{
job.Configuration.TriggerType = ContainerAppJobTriggerType.Schedule;
job.Configuration.ScheduleTriggerConfig.CronExpression = "0 2 * * 0"; // Weekly on Sunday at 2 AM
});

Executable resources can also be published as jobs:

C# — AppHost.cs
builder.AddExecutable("data-script", "python", ".", "process_data.py")
.PublishAsAzureContainerAppJob((_, job) =>
{
job.Configuration.TriggerType = ContainerAppJobTriggerType.Manual;
});
FAQCollaborateCommunityDiscussWatch