如何从一个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

虽然最新的dotnet SDK可以针对任何以前的SDK版本,但dotnet test需要特定的dotnet运行时。有很多方法可以将dotnet-sdk/运行时安装到基本docker映像中,但最简单的方法是从现有的基本映像中复制sdk和/或运行时。下面是dotnet6的一个例子,如果您需要dotnet5.0运行时进行单元测试:

FROM mcr.microsoft.com/dotnet/sdk:6.0 as build
#uncomment if you need the 5.0 SDK also (unlikely):
#COPY --from=mcr.microsoft.com/dotnet/sdk:5.0 /usr/share/dotnet/sdk /usr/share/dotnet/sdk
# "install" the dotnet 5 runtime
COPY --from=mcr.microsoft.com/dotnet/sdk:5.0 /usr/share/dotnet/shared /usr/share/dotnet/shared

如果你运行上面的图像,进入外壳并执行dotnet --info,它就像预期的那样:

$ docker run -it --rm 0de6f2cdf814
root@b4bb146dcf7e:/src# dotnet --info
.NET SDK (reflecting any global.json):
Version:   6.0.200
Commit:    4c30de7899
Runtime Environment:
OS Name:     debian
OS Version:  11
OS Platform: Linux
RID:         debian.11-x64
Base Path:   /usr/share/dotnet/sdk/6.0.200/
Host (useful for support):
Version: 6.0.2
Commit:  839cdfb0ec
.NET SDKs installed:
6.0.200 [/usr/share/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 5.0.10 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 6.0.2 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 5.0.10 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 6.0.2 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
To install additional .NET runtimes or SDKs:
https://aka.ms/dotnet-download
root@b4bb146dcf7e:/src# 

只需将Docker映像用于最新的.NET版本(当前为mcr.microsoft.com/dotnet/sdk:5.0(。它能够构建针对不同版本的项目。这与您在开发机器上本地执行此操作的方式相同。您只需在机器上安装5.0 SDK,即可构建针对2.1、3.1或5.0的项目。

如果您想在同一个容器中运行单元测试,则需要为5.0以外的每个版本安装所需的额外运行时。这将根据您的目标操作系统而有所不同,但您可以在https://learn.microsoft.com/en-us/dotnet/core/install/.例如,在Debian上,您可以安装带有以下内容的ASP.NET 3.1运行时:

wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && 
dpkg -i packages-microsoft-prod.deb && 
apt-get update && 
apt-get install -y apt-transport-https && 
apt-get update && 
apt-get install -y aspnetcore-runtime-3.1

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

有趣的是,有多目标:

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

不允许在sdk:2.1容器上生成,即使您指定只想使用参数-f netcoreapp2.12.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

最新更新