This is a short step-by-step tutorial to distribute a .NET Core application in a docker image.
I’ll cover how you can use Docker to run your application in an isolated, minimal environment with fewer moving parts.
To build and distribute a .NET Core application in Docker, first we need an application to Dockerize and some prerequisites.
In this tutorial, we'll perform the steps from a Terminal, like Windows command prompt.
First, create a working folder for our exercise
mkdir NetCoreDocker
Check .NET Core version installed on your computer
dotnet --info
Check Docker version installed on your computer
docker version
Place a file named global.json in exercise directory with the following content
{ "sdk": { "version": "3.0.100" } }
This will force the compiler to use 3.0 version of the SDK
Then create .NET Core console application
dotnet new console -o app -n myapp
The folder structure will be similar to the following example
NetCoreDocker │ global.json │ └───app │ myapp.csproj │ Program.cs │ └───obj myapp.csproj.nuget.cache myapp.csproj.nuget.g.props myapp.csproj.nuget.g.targets project.assets.json
.NET Core creates a console application that is executed, then terminated.
We modify the application that runs continuously instead.
Modify Program.cs as below
using System; namespace myapp { class Program { static void Main(string[] args) { var counter = 0; var max = args.Length != 0 ? Convert.ToInt32(args[0]) : -1; while(max == -1 || counter < max) { counter++; Console.WriteLine($"Counter: {counter}"); System.Threading.Tasks.Task.Delay(1000).Wait(); } } } }
Move in app sub-folder and test application
dotnet run
Finally, publish the application
dotnet publish -c Release
Application will be published in this folder
NetCoreDocker\app\bin\Release\netcoreapp3.0\publish
Place a file named Dockerfile in the working folder with the following content
FROM mcr.microsoft.com/dotnet/core/runtime:3.0 COPY app\bin\Release\netcoreapp3.0\publish app/ ENTRYPOINT ["dotnet", "app/myapp.dll"]
Now we can build Docker image of our application
docker build -t myimage -f Dockerfile .
Finally, verify the right build of the image
docker images
Final notice
If you want to try starting from the source code of your application (contained in the /src folder, not in the /app folder like now) and compile directly on a Docker image, change the Dockerfile contents with this multistage builds
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build WORKDIR /src COPY ["myapp.csproj", "./"] RUN dotnet restore "./myapp.csproj" COPY . . RUN dotnet build "myapp.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "myapp.csproj" -c Release -o /app FROM mcr.microsoft.com/dotnet/core/runtime:3.0 AS base WORKDIR /app EXPOSE 5001 FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "myapp.dll"]