With .NET 7 publishing a docker image became trivial. Really, all that's needed is to add a few entries into .csproj
file.
<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:7.0</ContainerBaseImage>
<ContainerRuntimeIdentifier>linux-x64</ContainerRuntimeIdentifier>
<ContainerImageName>test</ContainerImageName>
<ContainerImageTags>0.0.1</ContainerImageTags>
With those in place, and assuming we have docker working, we can then "publish" the image.
dotnet publish -c Release --no-self-contained \
/t:PublishContainer -p:PublishProfile=DefaultContainer \
Test.csproj
And there's nothing wrong with this. However, what if you want an image that's smaller than 270 MB this method offers? Well, there's always Alpine Linux. And yes, Microsoft offers an image for Alpine too.
So I changed my project values.
<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:7.0-alpine</ContainerBaseImage>
<ContainerRuntimeIdentifier>linux-x64</ContainerRuntimeIdentifier>
<ContainerImageName>test</ContainerImageName>
<ContainerImageTags>0.0.1</ContainerImageTags>
And that led me to a dreadful Error
/CrashLoopBackOff
state. My application simply wouldn't run and since the container crashed, it was really annoying to troubleshoot anything. But those familiar with .NET and Alpine Linux might see the issue. While almost any other Linux is happy with the linux-x64
moniker, our Alpine needs a special linux-musl-x64
value due to using a different libc implementation. And no, you cannot simply put that in .csproj
as you'll get error that The RuntimeIdentifier 'linux-musl-x64' is not supported by dotnet/runtime:7.0-alpine.
You need to add it to the publish
command line as an option
dotnet publish -c Release --no-self-contained -r linux-musl-x64\
/t:PublishContainer -p:PublishProfile=DefaultContainer \
Test.csproj
And now, our application should work on Alpine with considerable size savings without any issues.