microsoft/aspire · error · InvalidOperationException

Resource ' ' has multiple compute environments - ' '…

Error message

Resource '{resource.Name}' has multiple compute environments - '{computeEnvironmentNames}'. Please specify a single compute environment using 'WithComputeEnvironment'.

What it means

During publish/deploy, each resource must resolve to exactly one compute environment's DeploymentTargetAnnotation. If a resource has annotations from more than one compute environment and none was explicitly selected via WithComputeEnvironment, GetDeploymentTargetAnnotation throws because the target is ambiguous.

Solutions

  1. Call WithComputeEnvironment on the resource to select a single compute environment.
  2. Remove one of the conflicting environment bindings from the resource.
  3. Filter annotations to the environment you publish for before resolving the deployment target.

Example fix

// before
var aca = builder.AddAzureContainerAppEnvironment("aca");
var aks = builder.AddKubernetesEnvironment("aks");
var redis = builder.AddRedis("cache");
redis.WithComputeEnvironment(aca).WithComputeEnvironment(aks); // two environments
// after
redis.WithComputeEnvironment(aca); // select exactly one environment
Defensive patterns

Strategy: validation

Validate before calling

var envCount = resource.Annotations.OfType<DeploymentTargetAnnotation>().Select(a => a.ComputeEnvironment).Distinct().Count();
if (envCount > 1) throw new InvalidOperationException("Select a single compute environment with WithComputeEnvironment before publishing");

Try / catch

try { var target = resource.GetDeploymentTargetAnnotation(computeEnvironment); } catch (InvalidOperationException ex) when (ex.Message.Contains("multiple compute environments")) { /* prompt for explicit environment */ }

Prevention

When it happens

Trigger: Binding a resource to two or more compute environments (e.g. both ACA and Kubernetes environments in the same app model) without calling WithComputeEnvironment to pick one, then publishing.

Common situations: Multi-target publish setups where a resource is added to multiple environments (e.g. Azure App Service + ACA) for comparison, forgetting to disambiguate before deployment.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


AI-assisted analysis of microsoft/aspire@25830f84bd (2026-09-16). Data as JSON: /api/errors/661bcc55c34ebce0. Report an issue: GitHub.

Appendix: source

Thrown at src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs:1082

            }

            // If the resource is bound to a specific compute environment, use that one.
            selectedComputeEnvironment = computeEnvironmentAnnotation.ComputeEnvironment;
        }

        if (resource.TryGetAnnotationsOfType<DeploymentTargetAnnotation>(out var deploymentTargetAnnotations))
        {
            var annotations = deploymentTargetAnnotations.ToArray();

            if (selectedComputeEnvironment is not null)
            {
                return annotations.SingleOrDefault(a => a.ComputeEnvironment == selectedComputeEnvironment);
            }

            if (annotations.Length > 1)
            {
                var computeEnvironmentNames = string.Join(", ", annotations.Select(a => a.ComputeEnvironment?.Name));
                throw new InvalidOperationException($"Resource '{resource.Name}' has multiple compute environments - '{computeEnvironmentNames}'. Please specify a single compute environment using 'WithComputeEnvironment'.");
            }

            var deploymentTargetAnnotation = annotations[0];

            // If you have a DeploymentTargetAnnotation, it means the resource is bound to a specific compute environment.
            // Skip the annotation if it doesn't match the specified targetComputeEnvironment.
            if (targetComputeEnvironment is not null && targetComputeEnvironment != deploymentTargetAnnotation.ComputeEnvironment)
            {
                return null;
            }

            return deploymentTargetAnnotation;
        }
        return null;
    }

    /// <summary>
    /// Gets the lifetime type for the specified resource.

View on GitHub (pinned to 25830f84bd)