Skip to content

Request for feedback: Should we produce .NET Core + Server Core container images? #1852

@richlander

Description

@richlander

Request for feedback: Should we produce .NET Core + Server Core container images?

We are exploring the possibility of producing .NET Core + Server Core container images. This is due to hearing feedback from .NET Core users that the Nano Server lifecycle relative to a Windows Server host doesn't work well. We have also seen users needing to use Server Core images because Nano Server is not compatible with their workload.

Feedback:

Some context: We have long believed (on the .NET team) that customer demand for the combination of .NET Core and Server Core would be low and that producing .NET Core images for both Server Core and Nano Server would be confusing and send a mixed message. In short, we thought that nearly all .NET Core users would want Nano Server images. With that in mind, we decided to let customers produce Server Core container images themselves (but, of course, still support .NET Core with Server Core, generally). We are re-assessing this viewpoint and stance, but need your feedback to do so.

It would be very useful to know how many people/companies would use .NET Core + Server Core images if we made them available. Please tell us if you'd use these images, if you would use them instead of the .NET Core + Nano Server images, and what type of app you would host, preferably in this issue. If you are willing (or would prefer a private conversation), we will want to talk to you directly to learn more about your scenarios. You can reach out to me at rlander@ms.

Details

We have discussed a few different variants of what .NET Core + Server Core images could look like. There are two (meta) use cases we are considering, in terms of the types of apps that you host across your containerized .NET app portfolio:

  1. All apps are .NET Core.
  2. Mixture of .NET Core and .NET Framework apps, sometimes hosted in the same image.

Some context: In order to get the best performance for .NET Framework apps, we need to NGEN the framework. In fact, without NGEN, the performance is not acceptable. See microsoft/dotnet-framework-docker#29 for past experience on this topic. NGEN is even more important starting with the Server Core 2004 container image release. See: We made Windows Server Core container images 40% smaller.

If we were to publish Server Core images, we'd need to decide if we should NGEN the framework, which would have a non-trivial size impact. Example of NGEN usage: .NET Framework runtime image. Enabling IIS and ASP.NET (not Core) support would require similar configuration and size impact.

Some people might say ... "Hey, this is .NET Core; don't worry about .NET Framework." It's not so simple. We know that a non-trivial set of users will end up using the .NET Framework in these Server Core images, and then be unhappy, but not know why. We have found over time that users do everything imaginable (and beyond that) with the product, so we have to prepare for a lot of eventualities. We are one team responsible for two products and need to consider a broad set of scenarios in which images might be used.

Possible configurations

The following is a set of configurations that we can imagine supporting (some of which resolve the .NET Framework-related topics I've raised). I've provided names for these configurations to help frame what the benefit would be. We'd like you to tell us which of these options you like best, or if you'd want multiple. If your preferred option is missing, please tell us that, too.

  1. Straightforward "Core on Core" -- Publish one Server Core image per .NET Core version (example tags: dotnet-core/aspnet:3.1-windowsservercore-1909, dotnet/aspnet:5.0-windowsservercore-1909). This approach matches current practice (same model used for .NET Core on Nano Server, today). Details: do not NGEN the .NET Framework, or pre-install IIS or ASP.NET.
  2. Consolidate .NET Core versions on Server Core -- Publish one Server Core image with all in-support .NET Core versions included (we'd probably start with 3.1 and 5.0). Server Core images are multi-gigabyte, while .NET Core is relatively small. It might be cheaper and easier for many customers to base all application container images on a single Server Core image, independent of which .NET Core version was used. Details: Do not NGEN the .NET Framework, or install IIS or ASP.NET.
  3. Consolidate .NET Core and .NET Framework on Server Core -- -- Publish one Server Core image with all in-support .NET Core versions included, and .NET Framework (including ASP.NET and IIS fully enabled). Server Core images are multi-gigabyte, while .NET Core is relatively small and fully enabling .NET Framework doesn't cost much more. It might be cheaper and easier for many customers to base all application container images on a single Server Core image, independent of which .NET Core or .NET Framework version was used. Details: NGEN the .NET Framework, install IIS, and enable ASP.NET.

There are lots of sub-options for each of these, some of which we've already identified. For example, we could publish images aligning with options #1 and #2 in .NET Core docker repos and images aligning with option #3 in either .NET Core or .NET Framework repos. It all depends on how we want to approach this larger topic, and the scenarios we want to enable (and that you need).

I've only provided the tagging scheme for the first option, since it is so obvious. We have identified tagging schemes for the other two options, but they are more complicated (consolidation inherently complicates tagging), so we'll only continue to explore and share those if we we see interest in these other options. We want to keep this conversation as high-level as possible.

Please share your feedback!

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-dockerfilesConcerns the official .NET Dockerfiles or Dockerfile templatesneeds-announcementAn announcement is needed to discuss customer impact

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions