Skip to content

Docker compose deploy race condition #12805

@andrewbabbittdev

Description

@andrewbabbittdev

Is there an existing issue for this?

  • I have searched the existing issues

Describe the bug

Using docker compose with the new python integration results in a race condition on deploy where aspire is unable to write to the dockerfile in temp due to it being locked.

Expected Behavior

aspire deploy should execute successfully when using the docker compose environment along with the python integration.

Steps To Reproduce

use aspire new to create a React (Vite) & FastAPI starter app then use the following apphost:

#:sdk Aspire.AppHost.Sdk@13.1.0-preview.1.25556.11
#:package Aspire.Hosting.Docker@13.1.0-preview.1.25556.11
#:package Aspire.Hosting.Python@13.1.0-preview.1.25556.11

var builder = DistributedApplication.CreateBuilder(args);

builder.AddDockerComposeEnvironment("compose");

var app = builder.AddUvicornApp("app", "./app", "main:app")
    .WithUv()
    .WithExternalHttpEndpoints()
    .WithHttpHealthCheck("/health")
    .PublishAsDockerComposeService((resource, service) =>
    {
        service.Name = "app";
    });

builder.Build().Run();

Exceptions (if any)

Here is the output from aspire deploy --include-exception-details --log-level debug:

08:56:49 (pipeline execution) → Starting pipeline execution...
08:56:49 (build-prereq) → Starting build-prereq...
08:56:49 (deploy-prereq) → Starting deploy-prereq...
08:56:49 (publish-compose) → Starting publish-compose...
08:56:49 (deploy-prereq) i [INF] Initializing deployment for environment 'Production'
08:56:49 (build-prereq) ✓ build-prereq completed successfully
08:56:49 (publish-compose) i [INF] Generating Compose output
08:56:49 (deploy-prereq) i [INF] Setting default deploy tag 'aspire-deploy-20251107155649' for compute resource(s).
08:56:49 (deploy-prereq) ✓ deploy-prereq completed successfully
08:56:49 (build-app) → Starting build-app...
08:56:49 (build-app) i [INF] Building container image for resource app
08:56:49 (build-app) i [INF] Building image: app
08:56:49 (publish-compose) → Writing the Docker Compose file to the output path.
08:56:49 (build-app) ✗ [ERR] Step 'build-app' failed. System.InvalidOperationException: Step 'build-app' failed: The
process cannot access the file 'C:\Users\Andrew\AppData\Local\Temp\Dockerfile.app.b9508d880c5944a4b8275fdef54ce66d'
because it is being used by another process.
08:56:49 (build-app) ✗  ---> System.IO.IOException: The process cannot access the file
'C:\Users\Andrew\AppData\Local\Temp\Dockerfile.app.b9508d880c5944a4b8275fdef54ce66d' because it is being used by another
process.
08:56:49 (build-app) ✗    at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode,
FileAccess access, FileShare share, FileOptions options)
08:56:49 (build-app) ✗    at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess
access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
08:56:49 (build-app) ✗    at System.IO.File.OpenHandle(String path, FileMode mode, FileAccess access, FileShare share,
FileOptions options, Int64 preallocationSize)
08:56:49 (build-app) ✗    at System.IO.File.WriteToFileAsync(String path, FileMode mode, ReadOnlyMemory`1 contents,
Encoding encoding, CancellationToken cancellationToken)
08:56:49 (build-app) ✗    at
Aspire.Hosting.Publishing.ResourceContainerImageBuilder.BuildContainerImageFromDockerfileAsync(IResource resource,
DockerfileBuildAnnotation dockerfileBuildAnnotation, String imageName, ContainerBuildOptions options, CancellationToken
cancellationToken) in /_/src/Aspire.Hosting/Publishing/ResourceContainerImageBuilder.cs:line 356
08:56:49 (build-app) ✗    at Aspire.Hosting.Publishing.ResourceContainerImageBuilder.BuildImageAsync(IResource resource,
ContainerBuildOptions options, CancellationToken cancellationToken) in
/_/src/Aspire.Hosting/Publishing/ResourceContainerImageBuilder.cs:line 198
08:56:49 (build-app) ✗    at
Aspire.Hosting.ContainerResourceBuilderExtensions.<>c__DisplayClass0_0`1.<<EnsureBuildPipelineStepAnnotation>b__1>d.Move
Next() in /_/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs:line 45
08:56:49 (build-app) ✗ --- End of stack trace from previous location ---
08:56:49 (build-app) ✗    at Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep step,
PipelineStepContext stepContext) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 737
08:56:49 (build-app) ✗    --- End of inner exception stack trace ---
08:56:49 (build-app) ✗    at Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep step,
PipelineStepContext stepContext) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 742
08:56:49 (build-app) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_0.<<ExecuteStepsAsTaskDag>g__ExecuteStepWith
Dependencies|0>d.MoveNext() in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 553
08:56:49 (build-app) ✗ Step 'build-app' failed: The process cannot access the file
'C:\Users\Andrew\AppData\Local\Temp\Dockerfile.app.b9508d880c5944a4b8275fdef54ce66d' because it is being used by another
process.
08:56:49 (publish-compose) ✓ Writing the Docker Compose file to the output path. (0.0s)
08:56:49 (publish-compose) ✗ [ERR] Step 'publish-compose' failed. System.InvalidOperationException: Step
'publish-compose' failed: A task was canceled.
08:56:49 (publish-compose) ✗  ---> System.Threading.Tasks.TaskCanceledException: A task was canceled.
08:56:49 (publish-compose) ✗    at
Aspire.Hosting.Docker.DockerComposePublishingContext.WriteDockerComposeOutputAsync(DistributedApplicationModel model,
DockerComposeEnvironmentResource environment) in /_/src/Aspire.Hosting.Docker/DockerComposePublishingContext.cs:line 151
08:56:49 (publish-compose) ✗    at
Aspire.Hosting.Docker.DockerComposePublishingContext.WriteDockerComposeOutputAsync(DistributedApplicationModel model,
DockerComposeEnvironmentResource environment) in /_/src/Aspire.Hosting.Docker/DockerComposePublishingContext.cs:line 171
08:56:49 (publish-compose) ✗    at
Aspire.Hosting.Docker.DockerComposePublishingContext.WriteModelAsync(DistributedApplicationModel model,
DockerComposeEnvironmentResource environment) in /_/src/Aspire.Hosting.Docker/DockerComposePublishingContext.cs:line 61
08:56:49 (publish-compose) ✗    at Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep
step, PipelineStepContext stepContext) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 737
08:56:49 (publish-compose) ✗    --- End of inner exception stack trace ---
08:56:49 (publish-compose) ✗    at Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep
step, PipelineStepContext stepContext) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 742
08:56:49 (publish-compose) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_0.<<ExecuteStepsAsTaskDag>g__ExecuteStepWith
Dependencies|0>d.MoveNext() in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 553
08:56:49 (publish-compose) ✗ Step 'publish-compose' failed: A task was canceled.
08:56:49 (pipeline execution) ✗ [ERR] Multiple pipeline steps failed: publish-compose, build-app (Step 'publish-compose'
failed: A task was canceled.) (Step 'build-app' failed: The process cannot access the file
'C:\Users\Andrew\AppData\Local\Temp\Dockerfile.app.b9508d880c5944a4b8275fdef54ce66d' because it is being used by another
process.) System.AggregateException: Multiple pipeline steps failed: publish-compose, build-app (Step 'publish-compose'
failed: A task was canceled.) (Step 'build-app' failed: The process cannot access the file
'C:\Users\Andrew\AppData\Local\Temp\Dockerfile.app.b9508d880c5944a4b8275fdef54ce66d' because it is being used by another
process.)
08:56:49 (pipeline execution) ✗  ---> System.InvalidOperationException: Step 'publish-compose' failed: A task was
canceled.
08:56:49 (pipeline execution) ✗  ---> System.Threading.Tasks.TaskCanceledException: A task was canceled.
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Docker.DockerComposePublishingContext.WriteDockerComposeOutputAsync(DistributedApplicationModel model,
DockerComposeEnvironmentResource environment) in /_/src/Aspire.Hosting.Docker/DockerComposePublishingContext.cs:line 151
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Docker.DockerComposePublishingContext.WriteDockerComposeOutputAsync(DistributedApplicationModel model,
DockerComposeEnvironmentResource environment) in /_/src/Aspire.Hosting.Docker/DockerComposePublishingContext.cs:line 171
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Docker.DockerComposePublishingContext.WriteModelAsync(DistributedApplicationModel model,
DockerComposeEnvironmentResource environment) in /_/src/Aspire.Hosting.Docker/DockerComposePublishingContext.cs:line 61
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep step, PipelineStepContext
stepContext) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 737
08:56:49 (pipeline execution) ✗    --- End of inner exception stack trace ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep step, PipelineStepContext
stepContext) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 742
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_0.<<ExecuteStepsAsTaskDag>g__ExecuteStepWith
Dependencies|0>d.MoveNext() in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 553
08:56:49 (pipeline execution) ✗ --- End of stack trace from previous location ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_0.<<ExecuteStepsAsTaskDag>g__ExecuteStepWith
Dependencies|0>d.MoveNext() in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 561
08:56:49 (pipeline execution) ✗ --- End of stack trace from previous location ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_0.<<ExecuteStepsAsTaskDag>g__ExecuteStepWith
Dependencies|0>d.MoveNext() in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 567
08:56:49 (pipeline execution) ✗ --- End of stack trace from previous location ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_0.<<ExecuteStepsAsTaskDag>g__ExecuteStepWith
Dependencies|0>d.MoveNext() in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 516
08:56:49 (pipeline execution) ✗    --- End of inner exception stack trace ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepsAsTaskDag(List`1 steps, Dictionary`2 stepsByName,
PipelineContext context) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 628
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteAsync(PipelineContext context) in
/_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 281
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Publishing.PipelineExecutor.ExecutePipelineAsync(DistributedApplicationModel model, CancellationToken
cancellationToken) in /_/src/Aspire.Hosting/Publishing/PipelineExecutor.cs:line 103
08:56:49 (pipeline execution) ✗    at Aspire.Hosting.Publishing.PipelineExecutor.ExecuteAsync(CancellationToken
stoppingToken) in /_/src/Aspire.Hosting/Publishing/PipelineExecutor.cs:line 55
08:56:49 (pipeline execution) ✗  ---> (Inner Exception #1) System.InvalidOperationException: Step 'build-app' failed:
The process cannot access the file 'C:\Users\Andrew\AppData\Local\Temp\Dockerfile.app.b9508d880c5944a4b8275fdef54ce66d'
because it is being used by another process.
08:56:49 (pipeline execution) ✗  ---> System.IO.IOException: The process cannot access the file
'C:\Users\Andrew\AppData\Local\Temp\Dockerfile.app.b9508d880c5944a4b8275fdef54ce66d' because it is being used by another
process.
08:56:49 (pipeline execution) ✗    at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode
mode, FileAccess access, FileShare share, FileOptions options)
08:56:49 (pipeline execution) ✗    at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode,
FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
08:56:49 (pipeline execution) ✗    at System.IO.File.OpenHandle(String path, FileMode mode, FileAccess access, FileShare
share, FileOptions options, Int64 preallocationSize)
08:56:49 (pipeline execution) ✗    at System.IO.File.WriteToFileAsync(String path, FileMode mode, ReadOnlyMemory`1
contents, Encoding encoding, CancellationToken cancellationToken)
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Publishing.ResourceContainerImageBuilder.BuildContainerImageFromDockerfileAsync(IResource resource,
DockerfileBuildAnnotation dockerfileBuildAnnotation, String imageName, ContainerBuildOptions options, CancellationToken
cancellationToken) in /_/src/Aspire.Hosting/Publishing/ResourceContainerImageBuilder.cs:line 356
08:56:49 (pipeline execution) ✗    at Aspire.Hosting.Publishing.ResourceContainerImageBuilder.BuildImageAsync(IResource
resource, ContainerBuildOptions options, CancellationToken cancellationToken) in
/_/src/Aspire.Hosting/Publishing/ResourceContainerImageBuilder.cs:line 198
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.ContainerResourceBuilderExtensions.<>c__DisplayClass0_0`1.<<EnsureBuildPipelineStepAnnotation>b__1>d.Move
Next() in /_/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs:line 45
08:56:49 (pipeline execution) ✗ --- End of stack trace from previous location ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep step, PipelineStepContext
stepContext) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 737
08:56:49 (pipeline execution) ✗    --- End of inner exception stack trace ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepAsync(PipelineStep step, PipelineStepContext
stepContext) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 742
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_0.<<ExecuteStepsAsTaskDag>g__ExecuteStepWith
Dependencies|0>d.MoveNext() in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 553
08:56:49 (pipeline execution) ✗ --- End of stack trace from previous location ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_0.<<ExecuteStepsAsTaskDag>g__ExecuteStepWith
Dependencies|0>d.MoveNext() in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 561
08:56:49 (pipeline execution) ✗ --- End of stack trace from previous location ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.<>c__DisplayClass18_0.<<ExecuteStepsAsTaskDag>g__ExecuteStepWith
Dependencies|0>d.MoveNext() in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 567
08:56:49 (pipeline execution) ✗ --- End of stack trace from previous location ---
08:56:49 (pipeline execution) ✗    at
Aspire.Hosting.Pipelines.DistributedApplicationPipeline.ExecuteStepsAsTaskDag(List`1 steps, Dictionary`2 stepsByName,
PipelineContext context) in /_/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs:line 601<---
08:56:49 (pipeline execution) ✗
08:56:49 (pipeline execution) ✗ Failed
------------------------------------------------------------
✓ 2/5 steps succeeded • ✗ 3 failed • Total time: 0.0s

Steps Summary:
   0.0 s  ✗ pipeline execution
   0.0 s  ✗ publish-compose
   0.0 s  ✗ build-app
   0.0 s  ✓ deploy-prereq
   0.0 s  ✓ build-prereq

✗ PIPELINE FAILED
------------------------------------------------------------

.NET Version info

10.0.100-rc.2.25502.107

Anything else?

This interestingly works fine when used with static assets + vite app building, but fails when you only build the single python app.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions