microsoft / microsoft/aspire

ProjectResource does not support ContainerImageTag MSBuild property

Open
#12,470 3 comments 1 reaction 0 assignees View on GitHub
area-deployment
Dominant language
C#
Stars
6.3k
Forks
991
Avg merge
2d 15h
Merged PRs (30d)
196

Description

When a .NET csproj overrides the `ContainerImageTag` property, for example like this:

```xml


mytag2


```

We are not respecting the tag in Aspire. For example in this code:

https://github.com/dotnet/aspire/blob/3f36c1365c915a9890d7a47d68616cb8b6ae4b8e/src/Aspire.Hosting.Azure/AzureEnvironmentResourceHelpers.cs#L82-L104

This assumes the image tag will always be `latest` because it sets `localImageName` to just the resource name.

The same problem exists for the `ContainerRepository` MSBuild property. We should be respecting that.

When I set my image tag as above and try to deploy it, I get an error like this:

```
[DEBUG] Task 150a936e-cc0d-4691-a5fd-4d2a6d1a0511 (6a704485-b0d1-4944-9af3-02f7ac992569): Logging in to envacra3np3dqb27hfm
[DEBUG] Task 150a936e-cc0d-4691-a5fd-4d2a6d1a0511 (6a704485-b0d1-4944-9af3-02f7ac992569): COMPLETED - Logging in to envacra3np3dqb27hfm
[DEBUG] Successfully logged in to envacra3np3dqb27hfm
[DEBUG] Step 6a704485-b0d1-4944-9af3-02f7ac992569: COMPLETED - login-to-acr-env completed successfully
[DEBUG] Step 8: push-weatherapi
[DEBUG] Task 88300b7d-406c-4264-bc59-3650c5ce3215 (085be447-b2f1-450f-9926-3f8db936c577): Pushing weatherapi to envacra3np3dqb27hfm
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: fail: Aspire.Hosting.Publishing.DockerContainerRuntime[0]
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: Docker tag for weatherapi ->
envacra3np3dqb27hfm.azurecr.io/weatherapi:aspire-deploy-20251029020433 failed with exit code 1.
[02:04:43] [ERR] Docker tag for weatherapi -> envacra3np3dqb27hfm.azurecr.io/weatherapi:aspire-deploy-20251029020433 failed with exit code 1.
[DEBUG] Task 88300b7d-406c-4264-bc59-3650c5ce3215 (085be447-b2f1-450f-9926-3f8db936c577): FAILED - Pushing weatherapi to envacra3np3dqb27hfm
[DEBUG] Failed to push weatherapi: Docker tag failed with exit code 1.
[02:04:43] [ERR] Step 'push-weatherapi' failed.
[DEBUG] Step 085be447-b2f1-450f-9926-3f8db936c577: FAILED - Step 'push-weatherapi' failed: Docker tag failed with exit code 1.
[DEBUG] Step 9: pipeline-validation
[DEBUG] Task 86ce7ea1-3476-409f-9633-f9faa715e11b (73ffd1c3-0c8c-4004-a44d-55ee0ba5ab3d): Validating pipeline configuration
[DEBUG] Task 86ce7ea1-3476-409f-9633-f9faa715e11b (73ffd1c3-0c8c-4004-a44d-55ee0ba5ab3d): FAILED - Validating pipeline configuration
[DEBUG] Step 'push-weatherapi' failed: Docker tag failed with exit code 1.
[DEBUG] Step 73ffd1c3-0c8c-4004-a44d-55ee0ba5ab3d: FAILED - pipeline-validation completed with errors
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: fail: Aspire.Hosting.Publishing.PipelineExecutor[0]
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: Failed to execute the pipeline.
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: System.InvalidOperationException: Step 'push-weatherapi' failed: Docker tag failed with
exit code 1.
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: ---> Aspire.Hosting.DistributedApplicationException: Docker tag failed with exit code
1.
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Publishing.ContainerRuntimeBase`1.ExecuteContainerCommandAsync(String arguments, String errorLogTemplate, String successLogTemplate,
String exceptionMessageTemplate, CancellationToken cancellationToken, Object[] logArguments) in
D:\git\aspire\src\Aspire.Hosting\Publishing\ContainerRuntimeBase.cs:line 111
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Publishing.ContainerRuntimeBase`1.ExecuteContainerCommandAsync(String arguments, String errorLogTemplate, String successLogTemplate,
String exceptionMessageTemplate, CancellationToken cancellationToken, Object[] logArguments) in
D:\git\aspire\src\Aspire.Hosting\Publishing\ContainerRuntimeBase.cs:line 115
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at Aspire.Hosting.Publishing.ContainerRuntimeBase`1.TagImageAsync(String
localImageName, String targetImageName, CancellationToken cancellationToken) in
D:\git\aspire\src\Aspire.Hosting\Publishing\ContainerRuntimeBase.cs:line 44
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at Aspire.Hosting.Publishing.ResourceContainerImageBuilder.TagImageAsync(String
localImageName, String targetImageName, CancellationToken cancellationToken) in
D:\git\aspire\src\Aspire.Hosting\Publishing\ResourceContainerImageBuilder.cs:line 397
[DEBUG] DEPLOYMENT COMPLETED: FAILED - Step 'push-weatherapi' failed: Docker tag failed with exit code 1.
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at Aspire.Hosting.Azure.AzureEnvironmentResourceHelpers.TagAndPushImage(String
localTag, String targetTag, CancellationToken cancellationToken, IResourceContainerImageBuilder containerImageBuilder) in
D:\git\aspire\src\Aspire.Hosting.Azure\AzureEnvironmentResourceHelpers.cs:line 117
[21:04:43] [dbug] AppHostBackchannel: Requesting stop
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Azure.AzureEnvironmentResourceHelpers.PushImageToRegistryAsync(IContainerRegistry registry, IResource resource, PipelineStepContext
context, IResourceContainerImageBuilder containerImageBuilder) in D:\git\aspire\src\Aspire.Hosting.Azure\AzureEnvironmentResourceHelpers.cs:line 104
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Azure.AzureEnvironmentResourceHelpers.PushImageToRegistryAsync(IContainerRegistry registry, IResource resource, PipelineStepContext
context, IResourceContainerImageBuilder containerImageBuilder) in D:\git\aspire\src\Aspire.Hosting.Azure\AzureEnvironmentResourceHelpers.cs:line 110
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Azure.AzureEnvironmentResourceHelpers.PushImageToRegistryAsync(IContainerRegistry registry, IResource resource, PipelineStepContext
context, IResourceContainerImageBuilder containerImageBuilder) in D:\git\aspire\src\Aspire.Hosting.Azure\AzureEnvironmentResourceHelpers.cs:line 112
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Azure.AppContainers.AzureContainerAppResource.<>c__DisplayClass0_1.<<-ctor>b__3>d.MoveNext() in
D:\git\aspire\src\Aspire.Hosting.Azure.AppContainers\AzureContainerAppResource.cs:line 55
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: --- End of stack trace from previous location ---
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep step, PipelineStepContext stepContext) in
D:\git\aspire\src\Aspire.Hosting\Pipelines\DistributedApplicationPipeline.cs:line 739
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: --- End of inner exception stack trace ---
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep step, PipelineStepContext stepContext) in
D:\git\aspire\src\Aspire.Hosting\Pipelines\DistributedApplicationPipeline.cs:line 744
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_1.<g__ExecuteStepWithDependencies|0>d.MoveNext() in
D:\git\aspire\src\Aspire.Hosting\Pipelines\DistributedApplicationPipeline.cs:line 555
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: --- End of stack trace from previous location ---
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_1.<g__ExecuteStepWithDependencies|0>d.MoveNext() in
D:\git\aspire\src\Aspire.Hosting\Pipelines\DistributedApplicationPipeline.cs:line 563
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: --- End of stack trace from previous location ---
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_1.<g__ExecuteStepWithDependencies|0>d.MoveNext() in
D:\git\aspire\src\Aspire.Hosting\Pipelines\DistributedApplicationPipeline.cs:line 569
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: --- End of stack trace from previous location ---
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepsAsTaskDag(List`1 steps, Dictionary`2 stepsByName, PipelineContext context) in
D:\git\aspire\src\Aspire.Hosting\Pipelines\DistributedApplicationPipeline.cs:line 603
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteAsync(PipelineContext context) in
D:\git\aspire\src\Aspire.Hosting\Pipelines\DistributedApplicationPipeline.cs:line 283
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Publishing.PipelineExecutor.ExecutePipelineAsync(DistributedApplicationModel model, CancellationToken cancellationToken) in
D:\git\aspire\src\Aspire.Hosting\Publishing\PipelineExecutor.cs:line 92
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at
Aspire.Hosting.Publishing.PipelineExecutor.ExecutePipelineAsync(DistributedApplicationModel model, CancellationToken cancellationToken) in
D:\git\aspire\src\Aspire.Hosting\Publishing\PipelineExecutor.cs:line 114
[21:04:43] [dbug] DotNetCliRunner: dotnet(5240) stdout: at Aspire.Hosting.Publishing.PipelineExecutor.ExecuteAsync(CancellationToken
stoppingToken) in D:\git\aspire\src\Aspire.Hosting\Publishing\PipelineExecutor.cs:line 51
```

Instead, we should be querying for the ContainerRepository and ContainerImageTag MSBuild properties using something like

```dotnetcli
dotnet msbuild -getproperty:ContainerRepository -getproperty:ContainerImageTag -target ComputeContainerConfig
```

This will return the correct values. Then we should set that information on an Annotation so we can use it whenever we need to get the image name and tag.

cc @davidfowl @captainsafia @mitchdenny @baronfel

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.