首页 > 解决方案 > 如何从单个 Docker 映像定位多个 .NET Core 版本?

问题描述

我有一个针对.NET Standard 2.0的库。为了验证兼容性,我想使用 .NET Core 的当前和长期支持 (LTS) 版本运行我的单元测试。写这个问题时,那些是:

目标框架 目标框架名字对象 (TFM)
.NET 5.0(当前) net5.0
.NET Core 3.1 (LTS) netcoreapp3.1
.NET Core 2.1 (LTS) netcoreapp2.1

将 csproj 文件设置为针对多个框架很容易:

<PropertyGroup>
  <TargetFrameworks>netcoreapp2.1;netcoreapp3.1;net5.0</TargetFrameworks>
</PropertyGroup>

当安装了所有这些 SDK 时,这适用于本地构建。但是,我更愿意在单个轻量级 Docker 容器上进行 CI 构建。我不担心验证 .NET Framework 支持,所以我不需要 Windows。Docker Hub 上的.NET SDK 映像适用于任何单一框架(即mcr.microsoft.com/dotnet/sdk:5.0),但我想找到一个包含所有这三个 SDK 的 Docker 映像,而没有类似于GitHub 托管的 runners的“厨房水槽”图像,其中包括许多不相关的框架和工具。

我可以编写自己的Dockerfile,从基础映像开始编写额外 SDK 的安装脚本,但我肯定不能是唯一可以使用这样的东西的人。某个地方是否已经存在合适的 Docker 映像?我是否应该对这个问题采取不同的方法,例如使用setup-dotnet或等效方法编写 SDK 安装脚本?

标签: docker.net-core

解决方案


我试图避免构建自定义图像和编写额外的运行时脚本,所以我的变体是分别在多个容器 ( , ) 上运行构建sdk:2.1/sdk:3.1测试。

有趣的是,拥有多目标:

<PropertyGroup>
  <TargetFrameworks>netcoreapp2.1;netcoreapp3.1</TargetFrameworks>
</PropertyGroup>

不允许在sdk:2.1容器上构建,即使您指定您只想为 构建2.1,使用参数-f netcoreapp2.1

我最终得到了条件csproj文件,该文件TargetFrameworks基于外部参数指定。比如我的csproj配置是:

<TargetFrameworks Condition=" '$(TestTargetFramework)' == '' ">netstandard2.0;netstandard2.1</TargetFrameworks>
<TargetFrameworks Condition=" '$(TestTargetFramework)' == 'netcoreapp2.1' ">netstandard2.0</TargetFrameworks>
<TargetFrameworks Condition=" '$(TestTargetFramework)' == 'netcoreapp3.1' ">netstandard2.1</TargetFrameworks>

我可以在以下位置构建/测试它sdk:2.1

dotnet test ./test/Tests --configuration Release /p:TestTargetFramework=netcoreapp2.1

或者sdk:3.1

dotnet test ./test/Tests --configuration Release /p:TestTargetFramework=netcoreapp3.1

推荐阅读