This project demonstrates debugging an application inside a Docker container using JetBrains Rider, specifically designed for Ubuntu Chiseled environments.
A related discussion is available at the GitHub issue: dotnet/dotnet-docker#4942.
The issue arose when attempting to debug a .NET application in a Docker container.
The following error was encountered:
You must install or update .NET to run this application.
App: /app/bin/Debug/net8.0/UbuntuChiseledWorkerService.dll
Architecture: x64
Framework: 'Microsoft.AspNetCore.App', version '8.0.0' (x64)
.NET location: /usr/share/dotnet/
No frameworks were found.
Learn more:
https://aka.ms/dotnet/app-launch-failed
To install missing framework, download:
https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=8.0.0&arch=x64&rid=linux-x64&os=debian.12
This scenario tests the basic functionality of a WorkerService without any additional packages.
Dockerfile | Result |
---|---|
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base |
Works |
FROM mcr.microsoft.com/dotnet/runtime:8.0-noble-chiseled AS base |
Works |
FROM mcr.microsoft.com/dotnet/aspnet:8.0.7-noble-chiseled-extra-amd64 AS base |
Works |
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base |
Works |
This scenario adds a package that requires ASP.NET Core, for instance, prometheus-net.AspNetCore.
Dockerfile | Result |
---|---|
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base |
Does not work |
FROM mcr.microsoft.com/dotnet/runtime:8.0-noble-chiseled AS base |
Does not work |
FROM mcr.microsoft.com/dotnet/aspnet:8.0.7-noble-chiseled-extra-amd64 AS base |
Works |
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base |
Works |
This scenario explores the order and naming of stages in multi-stage Dockerfiles.
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS service
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base
- Result: Does not work (uses the first stage).
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS service
- Result: Works.
FROM mcr.microsoft.com/dotnet/runtime:8.0
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base
- Result: Does not work (uses the first named stage).
FROM mcr.microsoft.com/dotnet/aspnet:8.0.7-noble-chiseled-extra-amd64 as debug
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS service
FROM mcr.microsoft.com/dotnet/aspnet:8.0.7-noble-chiseled-extra-amd64 as publish
- Result: Works.
The issue arose from the initial inclusion of a service image based on mcr.microsoft.com/dotnet/runtime:8.0, which was intended to prepare files for subsequent stages. However, because Rider (the IDE being used) defaults to using the first available named stage, the presence of a package that required ASP.NET Core led to the error.
To resolve this issue, you can:
-
Add a Debug Stage:
- Insert an additional debug stage with the necessary image at the beginning of the Dockerfile. Since this stage is not used elsewhere, it will not impact the performance of the final image build.
Example:
FROM mcr.microsoft.com/dotnet/aspnet:8.0.7-noble-chiseled-extra-amd64 as debug FROM mcr.microsoft.com/dotnet/runtime:8.0 AS service FROM mcr.microsoft.com/dotnet/aspnet:8.0.7-noble-chiseled-extra-amd64 as publish
-
Create a Separate Debug Dockerfile:
- Alternatively, create a separate
DebugDockerfile
with just the necessary image and specify this Dockerfile in the debugging settings of your IDE.
- Alternatively, create a separate
-
Set Build Options in Rider:
- In Rider, you can set specific build options for your Dockerfile in the settings of the debug profile. For example, you can use the
--target
option to specify which stage to use during the build process. This ensures that the correct stage is selected and avoids the issue of the IDE defaulting to the first available named stage.
Example Option:
- In the debug profile settings, add
--target publish
to ensure that Rider builds the correct stage of your Dockerfile.
- In Rider, you can set specific build options for your Dockerfile in the settings of the debug profile. For example, you can use the
This approach ensures that the build process is consistent and avoids the issues related to the default stage selection behavior in the IDE, providing multiple solutions depending on your workflow and setup.