Container registry configuration
Aspire 13.1 introduced explicit container registry configuration, giving developers control over where and when container images are pushed during deployment. This article explains how to configure container registries for your Aspire applications.
Container registry configuration
Section titled “Container registry configuration”When deploying Aspire applications to production environments, your containerized services need to be pushed to a container registry. Prior to Aspire 13.1, registry configuration was often implicit, making it difficult to control and understand the deployment process. The new ContainerRegistryResource provides explicit configuration for:
- Generic container registries — DockerHub, GitHub Container Registry (GHCR), Harbor, or any Docker-compatible registry
- Azure Container Registry — First-class support with automatic credential management
- Pipeline integration — Control when images are built and pushed using
aspire do push - Authentication — Configure registry credentials securely
Generic container registries
Section titled “Generic container registries”Use the AddContainerRegistry method to configure a generic container registry for your application. This works with any Docker-compatible registry including DockerHub, GitHub Container Registry, Harbor, and private registries.
Basic usage
Section titled “Basic usage”The following example configures a container registry and associates it with a project resource:
var builder = DistributedApplication.CreateBuilder(args);
// Add a container registryvar registry = builder.AddContainerRegistry("myregistry", "registry.example.com");
// Associate the registry with a projectvar api = builder.AddProject<Projects.Api>("api") .WithContainerRegistry(registry);
builder.Build().Run();import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
// Add a container registryconst const registry: ContainerRegistryResource
registry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addContainerRegistry(name: string, endpoint: string | ParameterResource, options?: { repository?: string | ParameterResource;}): ContainerRegistryResource (+1 overload)
Adds a container registry resource
addContainerRegistry("myregistry", "registry.example.com");
// Associate the registry with a projectconst const api: ProjectResource
api = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("api", "../Api/Api.csproj");await const api: ProjectResource
api.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const registry: ContainerRegistryResource
registry);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();The preceding code:
- Creates a container registry resource pointing to
registry.example.com. - Associates the registry with the
apiproject. - When deploying, the
apiproject will be built as a container image and pushed to the specified registry.
DockerHub example
Section titled “DockerHub example”To push images to DockerHub, specify docker.io as the registry endpoint:
var builder = DistributedApplication.CreateBuilder(args);
var registry = builder.AddContainerRegistry("dockerhub", "docker.io");
var api = builder.AddProject<Projects.Api>("api") .WithContainerRegistry(registry);import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const registry: ContainerRegistryResource
registry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addContainerRegistry(name: string, endpoint: string | ParameterResource, options?: { repository?: string | ParameterResource;}): ContainerRegistryResource (+1 overload)
Adds a container registry resource
addContainerRegistry("dockerhub", "docker.io");
const const api: ProjectResource
api = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("api", "../Api/Api.csproj");await const api: ProjectResource
api.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const registry: ContainerRegistryResource
registry);GitHub Container Registry example
Section titled “GitHub Container Registry example”To push images to GitHub Container Registry (GHCR):
var builder = DistributedApplication.CreateBuilder(args);
var registry = builder.AddContainerRegistry("ghcr", "ghcr.io");
var api = builder.AddProject<Projects.Api>("api") .WithContainerRegistry(registry);import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const registry: ContainerRegistryResource
registry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addContainerRegistry(name: string, endpoint: string | ParameterResource, options?: { repository?: string | ParameterResource;}): ContainerRegistryResource (+1 overload)
Adds a container registry resource
addContainerRegistry("ghcr", "ghcr.io");
const const api: ProjectResource
api = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("api", "../Api/Api.csproj");await const api: ProjectResource
api.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const registry: ContainerRegistryResource
registry);Private registry example
Section titled “Private registry example”For private registries, provide the full registry URL:
var builder = DistributedApplication.CreateBuilder(args);
var registry = builder.AddContainerRegistry( "private-registry", "registry.mycompany.com:5000");
var api = builder.AddProject<Projects.Api>("api") .WithContainerRegistry(registry);import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const registry: ContainerRegistryResource
registry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addContainerRegistry(name: string, endpoint: string | ParameterResource, options?: { repository?: string | ParameterResource;}): ContainerRegistryResource (+1 overload)
Adds a container registry resource
addContainerRegistry( "private-registry", "registry.mycompany.com:5000");
const const api: ProjectResource
api = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("api", "../Api/Api.csproj");await const api: ProjectResource
api.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const registry: ContainerRegistryResource
registry);Authentication and credentials
Section titled “Authentication and credentials”Container registries typically require authentication for pushing images. You can configure credentials using parameters and secrets.
Using parameters for registry credentials
Section titled “Using parameters for registry credentials”Parameters allow you to provide registry configuration dynamically:
var builder = DistributedApplication.CreateBuilder(args);
var registryEndpoint = builder.AddParameter("registry-endpoint");var registryRepository = builder.AddParameter("registry-repository");
var registry = builder.AddContainerRegistry( "myregistry", registryEndpoint, registryRepository);
var api = builder.AddProject<Projects.Api>("api") .WithContainerRegistry(registry);import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const registryEndpoint: ParameterResource
registryEndpoint = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addParameter(name: string, options?: { secret?: boolean;}): ParameterResource (+1 overload)
Adds a parameter resource
addParameter("registry-endpoint");const const registryRepository: ParameterResource
registryRepository = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addParameter(name: string, options?: { secret?: boolean;}): ParameterResource (+1 overload)
Adds a parameter resource
addParameter("registry-repository");
const const registry: ContainerRegistryResource
registry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addContainerRegistry(name: string, endpoint: string | ParameterResource, repository?: string | ParameterResource): ContainerRegistryResource (+1 overload)
Adds a container registry resource
addContainerRegistry( "myregistry", const registryEndpoint: ParameterResource
registryEndpoint, const registryRepository: ParameterResource
registryRepository);
const const api: ProjectResource
api = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("api", "../Api/Api.csproj");await const api: ProjectResource
api.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const registry: ContainerRegistryResource
registry);For more information about parameters, see External parameters.
Configuring credentials
Section titled “Configuring credentials”Registry credentials should be configured through your deployment environment:
Docker login
Section titled “Docker login”Before pushing images, ensure you’re authenticated with the registry:
docker login registry.example.comFor DockerHub:
docker login docker.io -u usernameFor GitHub Container Registry:
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdinCI/CD configuration
Section titled “CI/CD configuration”In CI/CD environments (GitHub Actions, Azure Pipelines, and so on), configure credentials using secrets:
- name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Push images run: aspire do pushAzure Container Registry
Section titled “Azure Container Registry”Azure Container Registry (ACR) provides first-class integration with Aspire, with automatic credential management and parallel provisioning.
Explicit ACR configuration
Section titled “Explicit ACR configuration”Aspire 13.1 introduces explicit container registry configuration for Azure Container Apps environments:
var builder = DistributedApplication.CreateBuilder(args);
var environment = builder.AddAzureContainerAppEnvironment("myenv");
var api = builder.AddProject<Projects.Api>("api") .WithContainerRegistry(environment);
builder.Build().Run();import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const environment: AzureContainerAppEnvironmentResource
environment = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addAzureContainerAppEnvironment(name: string): AzureContainerAppEnvironmentResource
Adds an Azure Container App Environment resource
addAzureContainerAppEnvironment("myenv");
const const api: ProjectResource
api = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("api", "../Api/Api.csproj");await const api: ProjectResource
api.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const environment: AzureContainerAppEnvironmentResource
environment);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();In the preceding example:
- The code creates an Azure Container Apps environment with an associated ACR.
- The ACR is provisioned in parallel with that environment.
- Images are pushed as soon as the registry is available.
- Credentials are automatically managed through Azure authentication.
For more information, see Azure Container Registry integration.
Using an existing ACR
Section titled “Using an existing ACR”To use an existing Azure Container Registry, call the PublishAsExisting method when you add the ACR:
var builder = DistributedApplication.CreateBuilder(args);
var registryName = builder.AddParameter("registryName");var rgName = builder.AddParameter("rgName");
var acr = builder.AddAzureContainerRegistry("my-acr") .PublishAsExisting(registryName, rgName);
builder.AddAzureContainerAppEnvironment("env") .WithAzureContainerRegistry(acr);
var api = builder.AddProject<Projects.Api>("api") .WithContainerRegistry(acr);import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const registryName: ParameterResource
registryName = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addParameter(name: string, options?: { secret?: boolean;}): ParameterResource (+1 overload)
Adds a parameter resource
addParameter("registryName");const const rgName: ParameterResource
rgName = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addParameter(name: string, options?: { secret?: boolean;}): ParameterResource (+1 overload)
Adds a parameter resource
addParameter("rgName");
const const acr: AzureContainerRegistryResource
acr = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addAzureContainerRegistry(name: string): AzureContainerRegistryResource
Adds an Azure Container Registry resource to the distributed application model.
addAzureContainerRegistry("my-acr");await const acr: AzureContainerRegistryResource
acr.AzureContainerRegistryResource.publishAsExisting(name: string | ParameterResource, resourceGroup: string | ParameterResource): AzureContainerRegistryResource
Marks an Azure resource as existing in publish mode
publishAsExisting(const registryName: ParameterResource
registryName, const rgName: ParameterResource
rgName);
const const environment: AzureContainerAppEnvironmentResource
environment = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addAzureContainerAppEnvironment(name: string): AzureContainerAppEnvironmentResource
Adds an Azure Container App Environment resource
addAzureContainerAppEnvironment("env");await const environment: AzureContainerAppEnvironmentResource
environment.AzureContainerAppEnvironmentResource.withAzureContainerRegistry(registryBuilder: AzureContainerRegistryResource): AzureContainerAppEnvironmentResource
Configures a compute environment resource to use an Azure Container Registry.
withAzureContainerRegistry(const acr: AzureContainerRegistryResource
acr);
const const api: ProjectResource
api = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("api", "../Api/Api.csproj");await const api: ProjectResource
api.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const acr: AzureContainerRegistryResource
acr);Pipeline integration
Section titled “Pipeline integration”Aspire’s deployment pipeline includes a dedicated push step for pushing container images to registries.
Using aspire do push
Section titled “Using aspire do push”The aspire do push command builds container images and pushes them to configured registries:
aspire do pushThis command:
- Builds all container images for compute resources
- Tags images with the appropriate registry and repository names
- Pushes images to their configured registries
Example output:
16:03:38 (pipeline-execution) → Starting pipeline-execution...16:03:38 (build-api) → Starting build-api...16:03:43 (push-api) → Starting push-api...16:03:43 (push-api) → Pushing api to container-registry16:03:44 (push-api) i [INF] Docker tag for api -> docker.io/username/api:latest succeeded.16:04:05 (push-api) i [INF] Docker push for docker.io/username/api:latest succeeded.16:04:05 (push-api) ✓ Successfully pushed api to docker.io/username/api:latest (21.3s)16:04:05 (push-api) ✓ push-api completed successfullyFor more information about pipeline commands, see aspire do command.
Pipeline step dependencies
Section titled “Pipeline step dependencies”The push step automatically handles dependencies:
build-prereq— Ensures prerequisites are met before buildingbuild-<resource>— Builds container images for each resourcepush-<resource>— Pushes images to registries
You can execute individual steps or the entire pipeline:
aspire do buildaspire do deployThe deploy step includes building, pushing, and deploying all resources.
Complete examples
Section titled “Complete examples”Multi-registry deployment
Section titled “Multi-registry deployment”You can configure different registries for different resources:
var builder = DistributedApplication.CreateBuilder(args);
var publicRegistry = builder.AddContainerRegistry("dockerhub", "docker.io");var privateRegistry = builder.AddContainerRegistry( "private", "registry.company.com");
var publicApi = builder.AddProject<Projects.PublicApi>("public-api") .WithContainerRegistry(publicRegistry);
var internalApi = builder.AddProject<Projects.InternalApi>("internal-api") .WithContainerRegistry(privateRegistry);import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const publicRegistry: ContainerRegistryResource
publicRegistry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addContainerRegistry(name: string, endpoint: string | ParameterResource, options?: { repository?: string | ParameterResource;}): ContainerRegistryResource (+1 overload)
Adds a container registry resource
addContainerRegistry("dockerhub", "docker.io");const const privateRegistry: ContainerRegistryResource
privateRegistry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addContainerRegistry(name: string, endpoint: string | ParameterResource, options?: { repository?: string | ParameterResource;}): ContainerRegistryResource (+1 overload)
Adds a container registry resource
addContainerRegistry( "private", "registry.company.com");
const const publicApi: ProjectResource
publicApi = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("public-api", "../PublicApi/PublicApi.csproj");await const publicApi: ProjectResource
publicApi.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const publicRegistry: ContainerRegistryResource
publicRegistry);
const const internalApi: ProjectResource
internalApi = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("internal-api", "../InternalApi/InternalApi.csproj");await const internalApi: ProjectResource
internalApi.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const privateRegistry: ContainerRegistryResource
privateRegistry);Parameterized registry configuration
Section titled “Parameterized registry configuration”You can use parameters when you need flexible deployment across environments:
var builder = DistributedApplication.CreateBuilder(args);
var registryEndpoint = builder.AddParameter("registry-endpoint");var registryRepository = builder.AddParameter("registry-repository");
var registry = builder.AddContainerRegistry( "container-registry", registryEndpoint, registryRepository);
var api = builder.AddProject<Projects.Api>("api") .WithContainerRegistry(registry);
var worker = builder.AddProject<Projects.Worker>("worker") .WithContainerRegistry(registry);
builder.Build().Run();import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const registryEndpoint: ParameterResource
registryEndpoint = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addParameter(name: string, options?: { secret?: boolean;}): ParameterResource (+1 overload)
Adds a parameter resource
addParameter("registry-endpoint");const const registryRepository: ParameterResource
registryRepository = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addParameter(name: string, options?: { secret?: boolean;}): ParameterResource (+1 overload)
Adds a parameter resource
addParameter("registry-repository");
const const registry: ContainerRegistryResource
registry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addContainerRegistry(name: string, endpoint: string | ParameterResource, repository?: string | ParameterResource): ContainerRegistryResource (+1 overload)
Adds a container registry resource
addContainerRegistry( "container-registry", const registryEndpoint: ParameterResource
registryEndpoint, const registryRepository: ParameterResource
registryRepository);
const const api: ProjectResource
api = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("api", "../Api/Api.csproj");await const api: ProjectResource
api.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const registry: ContainerRegistryResource
registry);
const const worker: ProjectResource
worker = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("worker", "../Worker/Worker.csproj");await const worker: ProjectResource
worker.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const registry: ContainerRegistryResource
registry);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();Configure the parameters in your AppHost configuration:
{ "Parameters": { "registry-endpoint": "ghcr.io", "registry-repository": "myorg" }}Alternatively, use environment variables to configure them:
export Parameters__registry_endpoint="ghcr.io"export Parameters__registry_repository="myorg"Azure deployment with ACR
Section titled “Azure deployment with ACR”The following code constitutes a complete AppHost example with Azure Container Apps and ACR:
var builder = DistributedApplication.CreateBuilder(args);
// Create Azure Container Apps environment with ACRvar acaEnv = builder.AddAzureContainerAppEnvironment("production");
// Add Redis cachevar cache = builder.AddRedis("cache");
// Add API with registry configurationvar api = builder.AddProject<Projects.Api>("api") .WithReference(cache) .WithContainerRegistry(acaEnv);
// Add frontend with registry configurationvar web = builder.AddProject<Projects.Web>("web") .WithReference(api) .WithContainerRegistry(acaEnv);
builder.Build().Run();import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
// Create Azure Container Apps environment with ACRconst const environment: AzureContainerAppEnvironmentResource
environment = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addAzureContainerAppEnvironment(name: string): AzureContainerAppEnvironmentResource
Adds an Azure Container App Environment resource
addAzureContainerAppEnvironment("production");
// Add Redis cacheconst const cache: RedisResource
cache = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addRedis(name: string, options?: { port?: number; password?: string | ParameterResource;}): RedisResource (+1 overload)
Adds a Redis container resource
addRedis("cache");
// Add API with registry configurationconst const api: ProjectResource
api = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("api", "../Api/Api.csproj");await const api: ProjectResource
api.ProjectResource.withReference(source: IResource, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+1 overload)
Adds a reference to another resource
withReference(const cache: RedisResource
cache);await const api: ProjectResource
api.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const environment: AzureContainerAppEnvironmentResource
environment);
// Add frontend with registry configurationconst const web: ProjectResource
web = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileName?: string;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject("web", "../Web/Web.csproj");await const web: ProjectResource
web.ProjectResource.withReference(source: IResource, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+1 overload)
Adds a reference to another resource
withReference(const api: ProjectResource
api);await const web: ProjectResource
web.ProjectResource.withContainerRegistry(registry: IResource): ProjectResource
Configures a resource to use a container registry
withContainerRegistry(const environment: AzureContainerAppEnvironmentResource
environment);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();Benefits of explicit configuration
Section titled “Benefits of explicit configuration”The explicit container registry configuration introduced in Aspire 13.1 provides several benefits:
- Visibility — Clear understanding of where images are pushed
- Control — Explicit configuration of registry endpoints and credentials
- Parallelization — Registry provisioning happens in parallel with other resources
- Early feedback — Faster deployments with images pushing as soon as registries are ready
- Flexibility — Support for any Docker-compatible registry
For a deeper dive into container registry improvements, see Safia Abdalla’s blog post on fixing Aspire’s image problem.