Add Dockerfiles for CBL-Mariner (#2841)

This commit is contained in:
Matt Thalman 2021-06-09 14:07:38 -05:00
Родитель c8c749f107
Коммит d121e88133
24 изменённых файлов: 817 добавлений и 101 удалений

Просмотреть файл

@ -18,7 +18,7 @@ _The set of .NET versions that are being released as a unit._
- [ ] 3.1 runtime-deps shared with 5.0 and 6.0
1. - [ ] Wait for .NET archive files (.zip, .tar.gz) to be available at blob storage location
1. - [ ] Run `update-dependencies` tool to update all the necessary files to reflect the specified .NET versions (run this command for each version being released):
- [ ] `dotnet run --project .\eng\update-dependencies\update-dependencies.csproj <major/minor version> --product-version sdk=<sdk> --product-version runtime=<runtime> --product-version aspnet=<aspnet>`
- [ ] `./eng/Set-DotnetVersions.ps1 -ProductVersion <major/minor version> -SdkVersion <sdk> -RuntimeVersion <runtime> -AspnetVersion <aspnet>`
1. - [ ] Inspect generated changes for correctness
1. - [ ] Commit generated changes
1. - [ ] Create PR

Просмотреть файл

@ -76,10 +76,16 @@ Updating the product versions (e.g. .NET runtime, ASP.NET runtime, PowerShell, e
The following examples illustrate how to run `update-dependencies`:
- Update the 3.1 product versions
- Update the 3.1 product versions (uses a helper script for running update-dependencies)
``` console
> dotnet run --project .\eng\update-dependencies\ -- 3.1 --product-version runtime=3.1.6 --product-version aspnet=3.1.6 --product-version sdk=3.1.302
> ./eng/Set-DotnetVersions.ps1 -ProductVersion 3.1 -SdkVersion 3.1.302 -RuntimeVersion 3.1.6 -AspnetVersion 3.1.6
```
- Update the .NET Monitor version
``` console
> dotnet run --project .\eng\update-dependencies\update-dependencies.csproj 5.0 --product-version monitor=5.0.0-preview.5.21277.3 --channel-name 5.0/preview.5
```
- Update the PowerShell version used in the 5.0 images

Просмотреть файл

@ -0,0 +1,58 @@
#!/usr/bin/env pwsh
<#
.SYNOPSIS
Updates dependencies for the specified .NET version.
#>
[cmdletbinding()]
param(
# The major/minor version of the product (e.g. 6.0).
[Parameter(Mandatory = $true)]
[string]
$ProductVersion,
# Build version of the SDK
[string]
$SdkVersion,
# Build version of ASP.NET Core
[string]
$AspnetVersion,
# Build version of the .NET runtime
[string]
$RuntimeVersion,
# Compute the checksum if a published checksum cannot be found
[Switch]
$ComputeShas,
# When set, only prints out an Azure DevOps variable with the value of the args to pass to update-dependencies.
[Switch]
$PrintArgsVariableOnly
)
$updateDepsArgs = @($ProductVersion)
if ($SdkVersion) {
$updateDepsArgs += @("--product-version", "sdk=$SdkVersion")
}
if ($AspnetVersion) {
$updateDepsArgs += @("--product-version", "aspnet=$AspnetVersion", "--product-version", "aspnet-runtime-targeting-pack=$AspnetVersion")
}
if ($RuntimeVersion) {
$updateDepsArgs += @("--product-version", "runtime=$RuntimeVersion", "--product-version", "runtime-apphost-pack=$RuntimeVersion", "--product-version", "runtime-targeting-pack=$RuntimeVersion", "--product-version", "runtime-host=$RuntimeVersion", "--product-version", "runtime-hostfxr=$RuntimeVersion", "--product-version", "runtime-deps-cm.1=$RuntimeVersion", "--product-version", "netstandard-targeting-pack-2.1.0")
}
if ($ComputeShas) {
$updateDepsArgs += "--compute-shas"
}
if ($PrintArgsVariableOnly) {
Write-Host "##vso[task.setvariable variable=updateDepsArgs]$updateDepsArgs"
}
else {
& dotnet run --project $PSScriptRoot/update-dependencies/update-dependencies.csproj @updateDepsArgs
}

Просмотреть файл

@ -0,0 +1,15 @@
ARG REPO=mcr.microsoft.com/dotnet/runtime
FROM $REPO:6.0-{{OS_VERSION}}{{ARCH_TAG_SUFFIX}}
ENV \
# ASP.NET Core version
ASPNET_VERSION={{VARIABLES["aspnet|6.0|build-version"]}} \
# Set the default console formatter to JSON
Logging__Console__FormatterName=Json
# Install ASP.NET Core
RUN curl -SL --output aspnetcore.rpm https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNET_VERSION/aspnetcore-runtime-$ASPNET_VERSION-{{ARCH_SHORT}}.rpm \
&& dotnet_sha512='{{VARIABLES[cat("aspnet|6.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 aspnetcore.rpm" | sha512sum -c - \
&& rpm --install aspnetcore.rpm \
&& rm aspnetcore.rpm

Просмотреть файл

@ -0,0 +1,28 @@
FROM cblmariner.azurecr.io/base/core:{{OS_VERSION_NUMBER}}
RUN tdnf install -y \
ca-certificates \
\
# .NET dependencies
glibc \
icu \
krb5 \
libgcc \
libstdc++ \
openssl-libs \
zlib \
&& tdnf clean all
# Install dotnet-runtime-deps package
RUN dotnet_version={{VARIABLES["runtime|6.0|build-version"]}} \
&& curl -SL --output dotnet-runtime-deps.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$dotnet_version/dotnet-runtime-deps-$dotnet_version-cm.1-{{ARCH_SHORT}}.rpm \
&& dotnet_sha512='{{VARIABLES[cat("runtime-deps-cm.1|6.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 dotnet-runtime-deps.rpm" | sha512sum -c - \
&& rpm --install dotnet-runtime-deps.rpm \
&& rm dotnet-runtime-deps.rpm
ENV \
# Configure web servers to bind to port 80 when present
ASPNETCORE_URLS=http://+:80 \
# Enable detection of running in a container
DOTNET_RUNNING_IN_CONTAINER=true

Просмотреть файл

@ -0,0 +1,23 @@
ARG REPO=mcr.microsoft.com/dotnet/runtime-deps
FROM $REPO:6.0-{{OS_VERSION}}{{ARCH_TAG_SUFFIX}}
# Install .NET
ENV DOTNET_VERSION={{VARIABLES["runtime|6.0|build-version"]}}
RUN curl -SL --output dotnet-host.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-host-$DOTNET_VERSION-{{ARCH_SHORT}}.rpm \
&& dotnet_sha512='{{VARIABLES[cat("runtime-host|6.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 dotnet-host.rpm" | sha512sum -c - \
\
&& curl -SL --output dotnet-hostfxr.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-hostfxr-$DOTNET_VERSION-{{ARCH_SHORT}}.rpm \
&& dotnet_sha512='{{VARIABLES[cat("runtime-hostfxr|6.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 dotnet-hostfxr.rpm" | sha512sum -c - \
\
&& curl -SL --output dotnet-runtime.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-runtime-$DOTNET_VERSION-{{ARCH_SHORT}}.rpm \
&& dotnet_sha512='{{VARIABLES[cat("runtime|6.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 dotnet-runtime.rpm" | sha512sum -c - \
\
&& rpm --install dotnet-host.rpm dotnet-hostfxr.rpm dotnet-runtime.rpm \
&& rm dotnet-host.rpm dotnet-hostfxr.rpm dotnet-runtime.rpm \
\
## Manually configure symbol link due to https://github.com/dotnet/runtime/issues/53543
&& ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

Просмотреть файл

@ -0,0 +1,64 @@
ARG REPO=mcr.microsoft.com/dotnet/aspnet
FROM $REPO:6.0-{{OS_VERSION}}{{ARCH_TAG_SUFFIX}}
ENV \
# Unset ASPNETCORE_URLS from aspnet base image
ASPNETCORE_URLS= \
# Do not generate certificate
DOTNET_GENERATE_ASPNET_CERTIFICATE=false \
# Do not show first run text
DOTNET_NOLOGO=true \
# SDK version
DOTNET_SDK_VERSION={{VARIABLES["sdk|6.0|build-version"]}} \
# Enable correct mode for dotnet watch (only mode supported in a container)
DOTNET_USE_POLLING_FILE_WATCHER=true \
# Unset Logging__Console__FormatterName from aspnet base image
Logging__Console__FormatterName= \
# Skip extraction of XML docs - generally not useful within an image/container - helps performance
NUGET_XMLDOC_MODE=skip \
# PowerShell telemetry for docker image usage
POWERSHELL_DISTRIBUTION_CHANNEL=PSDocker-DotnetSDK-{{OS_ARCH_HYPHENATED}}
RUN tdnf install -y \
git \
&& tdnf clean all
# Install .NET SDK
RUN curl -SL --output dotnet.rpm https://dotnetcli.azureedge.net/dotnet/Sdk/$DOTNET_SDK_VERSION/dotnet-sdk-$DOTNET_SDK_VERSION-{{ARCH_SHORT}}.rpm \
&& dotnet_sha512='{{VARIABLES[cat("sdk|6.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 dotnet.rpm" | sha512sum -c - \
\
&& curl -SL --output apphost.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-apphost-pack-$DOTNET_VERSION-{{ARCH_SHORT}}.rpm \
&& dotnet_sha512='{{VARIABLES[cat("runtime-apphost-pack|6.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 apphost.rpm" | sha512sum -c - \
\
&& curl -SL --output targeting-pack.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-targeting-pack-$DOTNET_VERSION-{{ARCH_SHORT}}.rpm \
&& dotnet_sha512='{{VARIABLES[cat("runtime-targeting-pack|6.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 targeting-pack.rpm" | sha512sum -c - \
\
&& curl -SL --output aspnetcore-targeting-pack.rpm https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNET_VERSION/aspnetcore-targeting-pack-$ASPNET_VERSION.rpm \
&& dotnet_sha512='{{VARIABLES[cat("aspnet-runtime-targeting-pack|6.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 aspnetcore-targeting-pack.rpm" | sha512sum -c - \
\
&& curl -SL --output netstandard-targeting-pack.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/3.1.0/netstandard-targeting-pack-2.1.0-{{ARCH_SHORT}}.rpm \
&& dotnet_sha512='{{VARIABLES[cat("netstandard-targeting-pack-2.1.0|linux-rpm|", ARCH_SHORT, "|sha")]}}' \
&& echo "$dotnet_sha512 netstandard-targeting-pack.rpm" | sha512sum -c - \
\
&& rpm --install dotnet.rpm apphost.rpm targeting-pack.rpm aspnetcore-targeting-pack.rpm netstandard-targeting-pack.rpm \
&& rm dotnet.rpm apphost.rpm targeting-pack.rpm aspnetcore-targeting-pack.rpm netstandard-targeting-pack.rpm \
# Trigger first run experience by running arbitrary cmd
&& dotnet help
# Install PowerShell global tool
RUN powershell_version={{VARIABLES["powershell|6.0|build-version"]}} \
&& curl -SL --output PowerShell.Linux.{{ARCH_NUPKG}}.$powershell_version.nupkg https://pwshtool.blob.core.windows.net/tool/$powershell_version/PowerShell.Linux.{{ARCH_NUPKG}}.$powershell_version.nupkg \
&& powershell_sha512='{{VARIABLES[cat("powershell|6.0|Linux|", ARCH_NUPKG, "|sha")]}}' \
&& echo "$powershell_sha512 PowerShell.Linux.{{ARCH_NUPKG}}.$powershell_version.nupkg" | sha512sum -c - \
&& mkdir -p /usr/share/powershell \
&& dotnet tool install --add-source / --tool-path /usr/share/powershell --version $powershell_version PowerShell.Linux.{{ARCH_NUPKG}} \
&& dotnet nuget locals all --clear \
&& rm PowerShell.Linux.{{ARCH_NUPKG}}.$powershell_version.nupkg \
&& ln -s /usr/share/powershell/pwsh /usr/bin/pwsh \
&& chmod 755 /usr/share/powershell/pwsh \
# To reduce image size, remove the copy nupkg that nuget keeps.
&& find /usr/share/powershell -print | grep -i '.*[.]nupkg$' | xargs rm

Просмотреть файл

@ -20,19 +20,17 @@ stages:
steps:
- script: $(engPath)/get-drop-versions.sh $(channel)
displayName: Get Versions
- powershell: $(engPath)/Set-DotnetVersions.ps1 $(dockerfileVersion) -RuntimeVersion $(runtimeVer) -AspnetVersion $(aspnetVer) -SdkVersion $(sdkVer) -ComputeShas -PrintArgsVariableOnly
displayName: Get update-dependencies args
- script: docker build -t update-dependencies -f $(engPath)/update-dependencies/Dockerfile --pull .
displayName: Build Update Dependencies Tool
- script: >
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock update-dependencies
$(dockerfileVersion)
$(updateDepsArgs)
--user $(dotnetDockerBot.userName)
--email $(dotnetDockerBot.email)
--password $(BotAccount-dotnet-docker-bot-PAT)
--product-version runtime=$(runtimeVer)
--product-version sdk=$(sdkVer)
--product-version aspnet=$(aspnetVer)
--version-source-name dotnet/core-sdk
--compute-shas
displayName: Run Update Dependencies
- stage: Monitor
condition: eq(variables['update-monitor-enabled'], 'true')

Просмотреть файл

@ -13,6 +13,7 @@ using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.DotNet.VersionTools.Dependencies;
#nullable enable
namespace Dotnet.Docker
{
/// <summary>
@ -24,30 +25,67 @@ namespace Dotnet.Docker
private const string ChecksumsHostName = "dotnetclichecksums.blob.core.windows.net";
private const string ShaVariableGroupName = "shaVariable";
private const string ShaValueGroupName = "shaValue";
private const string NetStandard21TargetingPack = "netstandard-targeting-pack-2.1.0";
private const string DotnetBaseUrl = "https://dotnetcli.azureedge.net/dotnet";
private static readonly Dictionary<string, string> s_shaCache = new Dictionary<string, string>();
private static readonly Dictionary<string, Dictionary<string, string>> s_releaseChecksumCache =
new Dictionary<string, Dictionary<string, string>>();
private static readonly Dictionary<string, string> s_urls = new Dictionary<string, string> {
{"powershell", "https://pwshtool.blob.core.windows.net/tool/$VERSION_DIR/PowerShell.$OS.$ARCH.$VERSION_FILE.nupkg"},
{"monitor", "https://dotnetcli.azureedge.net/dotnet/diagnostics/monitor$CHANNEL_NAME/dotnet-monitor.$VERSION_FILE.nupkg"},
{"runtime", "https://dotnetcli.azureedge.net/dotnet/Runtime/$VERSION_DIR/dotnet-runtime-$VERSION_FILE-$OS-$ARCH.$ARCHIVE_EXT"},
{"aspnet", "https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$VERSION_DIR/aspnetcore-runtime-$VERSION_FILE-$OS-$ARCH.$ARCHIVE_EXT"},
{"sdk", "https://dotnetcli.azureedge.net/dotnet/Sdk/$VERSION_DIR/dotnet-sdk-$VERSION_FILE-$OS-$ARCH.$ARCHIVE_EXT"},
{"lzma", "https://dotnetcli.azureedge.net/dotnet/Sdk/$VERSION_DIR/nuGetPackagesArchive.lzma"}
private static readonly Dictionary<string, string> s_shaCache = new();
private static readonly Dictionary<string, Dictionary<string, string>> s_releaseChecksumCache = new();
// Maps a product name to a set of one or more candidate URLs referencing the associated artifact. The order of the URLs
// should be in priority order with each subsequent URL being the fallback. This is primarily intended to support targeting
// pack RPMs because they only ship once for a given major/minor release and never again for servicing releases. However, during
// preview releases, they ship with each build. By making use of fallback URLs it allows support for either scenario, first checking
// for the build-specific location and then falling back to the overall major/minor release location.
private static readonly Dictionary<string, string[]> s_urls = new() {
{"powershell", new string[] { "https://pwshtool.blob.core.windows.net/tool/$VERSION_DIR/PowerShell.$OS.$ARCH.$VERSION_FILE.nupkg" }},
{"monitor", new string[] { $"{DotnetBaseUrl}/diagnostics/monitor$CHANNEL_NAME/dotnet-monitor.$VERSION_FILE.nupkg" }},
{"runtime", new string[] { $"{DotnetBaseUrl}/Runtime/$VERSION_DIR/dotnet-runtime-$VERSION_FILE$OPTIONAL_OS-$ARCH.$ARCHIVE_EXT" }},
{"runtime-host", new string[] { $"{DotnetBaseUrl}/Runtime/$VERSION_DIR/dotnet-host-$VERSION_FILE-$ARCH.$ARCHIVE_EXT" }},
{"runtime-hostfxr", new string[] { $"{DotnetBaseUrl}/Runtime/$VERSION_DIR/dotnet-hostfxr-$VERSION_FILE-$ARCH.$ARCHIVE_EXT" }},
{"runtime-targeting-pack", new string[]
{
$"{DotnetBaseUrl}/Runtime/$VERSION_DIR/dotnet-targeting-pack-$VERSION_FILE-$ARCH.$ARCHIVE_EXT",
$"{DotnetBaseUrl}/Runtime/$DF_VERSION.0/dotnet-targeting-pack-$DF_VERSION.0-$ARCH.$ARCHIVE_EXT"
}
},
{"runtime-apphost-pack", new string[] { $"{DotnetBaseUrl}/Runtime/$VERSION_DIR/dotnet-apphost-pack-$VERSION_FILE-$ARCH.$ARCHIVE_EXT" }},
{NetStandard21TargetingPack, new string[] { $"{DotnetBaseUrl}/Runtime/3.1.0/netstandard-targeting-pack-2.1.0-$ARCH.$ARCHIVE_EXT" }},
{"runtime-deps-cm.1", new string[] { $"{DotnetBaseUrl}/Runtime/$VERSION_DIR/dotnet-runtime-deps-$VERSION_FILE-cm.1-$ARCH.$ARCHIVE_EXT" }},
{"aspnet", new string[] { $"{DotnetBaseUrl}/aspnetcore/Runtime/$VERSION_DIR/aspnetcore-runtime-$VERSION_FILE$OPTIONAL_OS-$ARCH.$ARCHIVE_EXT" }},
{"aspnet-runtime-targeting-pack", new string[]
{
$"{DotnetBaseUrl}/aspnetcore/Runtime/$VERSION_DIR/aspnetcore-targeting-pack-$VERSION_FILE.$ARCHIVE_EXT",
$"{DotnetBaseUrl}/aspnetcore/Runtime/$DF_VERSION.0/aspnetcore-targeting-pack-$DF_VERSION.0.$ARCHIVE_EXT"
}
},
{"sdk", new string[] { $"{DotnetBaseUrl}/Sdk/$VERSION_DIR/dotnet-sdk-$VERSION_FILE$OPTIONAL_OS-$ARCH.$ARCHIVE_EXT" }},
{"lzma", new string[] { $"{DotnetBaseUrl}/Sdk/$VERSION_DIR/nuGetPackagesArchive.lzma" }}
};
private static HttpClient s_httpClient { get; } = new HttpClient();
private string _productName;
private string _dockerfileVersion;
private string _buildVersion;
private string _arch;
private string _os;
private Options _options;
private string _versions;
private static HttpClient s_httpClient { get; } = new();
public DockerfileShaUpdater() : base()
private readonly string _productName;
private readonly string _dockerfileVersion;
private readonly string? _buildVersion;
private readonly string _arch;
private readonly string _os;
private readonly Options _options;
private readonly string _versions;
public DockerfileShaUpdater(
string productName, string dockerfileVersion, string? buildVersion, string arch, string os, string versions, Options options)
{
_productName = productName;
_dockerfileVersion = dockerfileVersion;
_buildVersion = buildVersion;
_arch = arch;
_os = os;
_versions = versions;
_options = options;
}
public static IEnumerable<IDependencyUpdater> CreateUpdaters(
@ -58,9 +96,18 @@ namespace Dotnet.Docker
// The format of the sha variable name is '<productName>|<dockerfileVersion>|<os>|<arch>|sha'.
// The 'os' and 'arch' segments are optional.
string shaVariablePattern =
$"\"(?<{ShaVariableGroupName}>{Regex.Escape(productName)}\\|{Regex.Escape(dockerfileVersion)}.*\\|sha)\":";
Regex shaVariableRegex = new Regex(shaVariablePattern);
string shaVariablePattern;
if (productName == NetStandard21TargetingPack)
{
// NetStandard targeting pack is not associated with a specific Dockerfile version
shaVariablePattern = $"\"(?<{ShaVariableGroupName}>{Regex.Escape(productName)}.*\\|sha)\":";
}
else
{
shaVariablePattern = $"\"(?<{ShaVariableGroupName}>{Regex.Escape(productName)}\\|{Regex.Escape(dockerfileVersion)}.*\\|sha)\":";
}
Regex shaVariableRegex = new(shaVariablePattern);
return shaVariableRegex.Matches(versions)
.Select(match => match.Groups[ShaVariableGroupName].Value)
@ -69,15 +116,15 @@ namespace Dotnet.Docker
Trace.TraceInformation($"Updating {variable}");
string[] parts = variable.Split('|');
DockerfileShaUpdater updater = new DockerfileShaUpdater()
DockerfileShaUpdater updater = new(
productName,
dockerfileVersion,
GetBuildVersion(productName, dockerfileVersion, versions, options),
GetArch(parts),
GetOs(parts),
versions,
options)
{
_productName = productName,
_buildVersion = GetBuildVersion(productName, dockerfileVersion, versions, options),
_dockerfileVersion = dockerfileVersion,
_os = parts.Length >= 4 ? parts[2] : string.Empty,
_arch = parts.Length >= 5 ? parts[3] : string.Empty,
_options = options,
_versions = versions,
Path = versionsPath,
VersionGroupName = ShaValueGroupName
};
@ -92,7 +139,7 @@ namespace Dotnet.Docker
.ToArray();
}
protected override string TryGetDesiredValue(
protected override string? TryGetDesiredValue(
IEnumerable<IDependencyInfo> dependencyBuildInfos, out IEnumerable<IDependencyInfo> usedBuildInfos)
{
IDependencyInfo productInfo = dependencyBuildInfos.First(info => info.SimpleName == _productName);
@ -101,27 +148,87 @@ namespace Dotnet.Docker
const string RtmSubstring = "-rtm.";
string versionDir = _buildVersion;
string versionFile = _buildVersion;
if (versionFile.Contains(RtmSubstring))
string? versionDir = _buildVersion;
string? versionFile = _buildVersion;
if (versionFile?.Contains(RtmSubstring) == true)
{
versionFile = versionFile.Substring(0, versionFile.IndexOf(RtmSubstring));
}
string downloadUrl = s_urls[_productName]
.Replace("$ARCHIVE_EXT", _os.Contains("win") ? "zip" : "tar.gz")
.Replace("$VERSION_DIR", versionDir)
.Replace("$VERSION_FILE", versionFile)
.Replace("$CHANNEL_NAME", _options.ChannelName)
.Replace("$OS", _os)
.Replace("$ARCH", _arch)
.Replace("..", ".");
return GetArtifactShaAsync(downloadUrl).Result;
string archiveExt;
if (_os.Contains("win"))
{
archiveExt = "zip";
}
else if (_os.Contains("rpm"))
{
archiveExt = "rpm";
}
else
{
archiveExt = "tar.gz";
}
string optionalOs = _os.Contains("rpm") ? string.Empty : $"-{_os}";
// Each product name has one or more candidate URLs from which to retrieve the artifact. Multiple candidate URLs
// should be listed in priority order. Each subsequent URL listed is treated as a fallback.
string[] candidateUrls = s_urls[_productName];
for (int i = 0; i < candidateUrls.Length; i++)
{
string downloadUrl = candidateUrls[i]
.Replace("$ARCHIVE_EXT", archiveExt)
.Replace("$VERSION_DIR", versionDir)
.Replace("$VERSION_FILE", versionFile)
.Replace("$CHANNEL_NAME", _options.ChannelName)
.Replace("$OS", _os)
.Replace("$OPTIONAL_OS", optionalOs)
.Replace("$ARCH", _arch)
.Replace("$DF_VERSION", _options.DockerfileVersion)
.Replace("..", ".");
string? result = GetArtifactShaAsync(downloadUrl, errorOnNotFound: i == candidateUrls.Length - 1).Result;
if (result is not null)
{
return result;
}
}
return null;
}
private async Task<string> GetArtifactShaAsync(string downloadUrl)
private static string GetOs(string[] variableParts)
{
if (!s_shaCache.TryGetValue(downloadUrl, out string sha))
if (variableParts.Length == 4)
{
// Handles the case of "netstandard-targeting-pack-2.1.0|linux-rpm|x64|sha".
return variableParts[1];
}
else if (variableParts.Length >= 5)
{
return variableParts[2];
}
return string.Empty;
}
private static string GetArch(string[] variableParts)
{
if (variableParts.Length == 4)
{
// Handles the case of "netstandard-targeting-pack-2.1.0|linux-rpm|x64|sha".
return variableParts[2];
}
else if (variableParts.Length >= 5)
{
return variableParts[3];
}
return string.Empty;
}
private async Task<string?> GetArtifactShaAsync(string downloadUrl, bool errorOnNotFound)
{
if (!s_shaCache.TryGetValue(downloadUrl, out string? sha))
{
sha = await GetDotNetCliChecksumsShaAsync(downloadUrl)
?? await GetDotNetReleaseChecksumsShaFromRuntimeVersionAsync(downloadUrl)
@ -136,21 +243,29 @@ namespace Dotnet.Docker
}
else
{
Trace.TraceError($"Unable to retrieve sha for '{downloadUrl}'.");
string notFoundMsg = $"Unable to retrieve sha for '{downloadUrl}'.";
if (errorOnNotFound)
{
Trace.TraceError(notFoundMsg);
}
else
{
Trace.TraceWarning(notFoundMsg);
}
}
}
return sha;
}
private async Task<string> ComputeChecksumShaAsync(string downloadUrl)
private async Task<string?> ComputeChecksumShaAsync(string downloadUrl)
{
if (!_options.ComputeChecksums)
{
return null;
}
string sha = null;
string? sha = null;
Trace.TraceInformation($"Downloading '{downloadUrl}'.");
using (HttpResponseMessage response = await s_httpClient.GetAsync(downloadUrl))
@ -179,9 +294,9 @@ namespace Dotnet.Docker
return sha;
}
private async Task<string> GetDotNetCliChecksumsShaAsync(string productDownloadUrl)
private async Task<string?> GetDotNetCliChecksumsShaAsync(string productDownloadUrl)
{
string sha = null;
string? sha = null;
string shaExt = _productName.Contains("sdk", StringComparison.OrdinalIgnoreCase) ? ".sha" : ".sha512";
UriBuilder uriBuilder = new UriBuilder(productDownloadUrl)
@ -206,10 +321,10 @@ namespace Dotnet.Docker
return sha;
}
private Task<string> GetDotNetReleaseChecksumsShaFromRuntimeVersionAsync(
private Task<string?> GetDotNetReleaseChecksumsShaFromRuntimeVersionAsync(
string productDownloadUrl)
{
string version = _buildVersion;
string? version = _buildVersion;
// The release checksum file contains content for all products in the release (runtime, sdk, etc.)
// and is referenced by the runtime version.
if (_productName.Contains("sdk", StringComparison.OrdinalIgnoreCase) ||
@ -221,17 +336,17 @@ namespace Dotnet.Docker
return GetDotNetReleaseChecksumsShaAsync(productDownloadUrl, version);
}
private Task<string> GetDotNetReleaseChecksumsShaFromBuildVersionAsync(string productDownloadUrl) =>
private Task<string?> GetDotNetReleaseChecksumsShaFromBuildVersionAsync(string productDownloadUrl) =>
GetDotNetReleaseChecksumsShaAsync(productDownloadUrl, _buildVersion);
private async Task<string> GetDotNetReleaseChecksumsShaAsync(
string productDownloadUrl, string version)
private async Task<string?> GetDotNetReleaseChecksumsShaAsync(
string productDownloadUrl, string? version)
{
IDictionary<string, string> checksumEntries = await GetDotnetReleaseChecksums(version);
string installerFileName = productDownloadUrl.Substring(productDownloadUrl.LastIndexOf('/') + 1);
if (!checksumEntries.TryGetValue(installerFileName, out string sha))
if (!checksumEntries.TryGetValue(installerFileName, out string? sha))
{
Trace.TraceInformation($"Failed to find `{installerFileName}` sha");
}
@ -239,10 +354,10 @@ namespace Dotnet.Docker
return sha;
}
private static async Task<IDictionary<string, string>> GetDotnetReleaseChecksums(string version)
private static async Task<IDictionary<string, string>> GetDotnetReleaseChecksums(string? version)
{
string uri = $"https://dotnetcli.blob.core.windows.net/dotnet/checksums/{version}-sha.txt";
if (s_releaseChecksumCache.TryGetValue(uri, out Dictionary<string, string> checksumEntries))
if (s_releaseChecksumCache.TryGetValue(uri, out Dictionary<string, string>? checksumEntries))
{
return checksumEntries;
}
@ -286,9 +401,9 @@ namespace Dotnet.Docker
return checksumEntries;
}
private static string GetBuildVersion(string productName, string dockerfileVersion, string variables, Options options)
private static string? GetBuildVersion(string productName, string dockerfileVersion, string variables, Options options)
{
if (options.ProductVersions.TryGetValue(productName, out string version))
if (options.ProductVersions.TryGetValue(productName, out string? version))
{
return version;
}
@ -297,3 +412,4 @@ namespace Dotnet.Docker
}
}
}
#nullable disable

Просмотреть файл

@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.CommandLine;
using System.Linq;
#nullable enable
namespace Dotnet.Docker
{
public class Options
@ -18,7 +19,7 @@ namespace Dotnet.Docker
public string GitHubUpstreamBranch => "nightly";
public string GitHubUpstreamOwner => "dotnet";
public string GitHubUser { get; private set; }
public IDictionary<string, string> ProductVersions { get; set; } = new Dictionary<string, string>();
public IDictionary<string, string?> ProductVersions { get; set; } = new Dictionary<string, string?>();
public string VersionSourceName { get; private set; }
public bool UpdateOnly => GitHubEmail == null || GitHubPassword == null || GitHubUser == null;
@ -27,7 +28,7 @@ namespace Dotnet.Docker
DockerfileVersion = dockerfileVersion;
ProductVersions = productVersion
.Select(pair => pair.Split(new char[] { '=' }, 2))
.ToDictionary(split => split[0].ToLower(), split => split[1]);
.ToDictionary(split => split[0].ToLower(), split => split.Skip(1).FirstOrDefault());
ChannelName = channelName;
VersionSourceName = versionSourceName;
GitHubEmail = email;
@ -66,3 +67,4 @@ namespace Dotnet.Docker
};
}
}
#nullable disable

Просмотреть файл

@ -8,6 +8,7 @@ using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
#nullable enable
namespace Dotnet.Docker
{
/// <summary>
@ -50,7 +51,7 @@ namespace Dotnet.Docker
};
}
private string GetBuildVersion(IDependencyInfo productInfo) => productInfo.SimpleVersion;
private static string GetBuildVersion(IDependencyInfo productInfo) => productInfo.SimpleVersion ?? string.Empty;
public static string GetBuildVersion(string productName, string dockerfileVersion, string variables)
{
@ -71,8 +72,13 @@ namespace Dotnet.Docker
return match.Groups[s_versionGroupName].Value;
}
private string GetProductVersion(IDependencyInfo productInfo)
private static string GetProductVersion(IDependencyInfo productInfo)
{
if (productInfo.SimpleVersion is null)
{
return string.Empty;
}
// Derive the Docker tag version from the product build version.
// 5.0.0-preview.2.19530.9 => 5.0.0-preview.2
string versionRegexPattern = "[\\d]+.[\\d]+.[\\d]+(-[\\w]+(.[\\d]+)?)?";
@ -98,3 +104,4 @@ namespace Dotnet.Docker
$"{productName}|{dockerfileVersion}|{versionType.ToString().ToLowerInvariant()}-version";
}
}
#nullable disable

Просмотреть файл

@ -756,6 +756,33 @@
"variant": "v8"
}
]
},
{
"productVersion": "$(dotnet|6.0|product-version)",
"sharedTags": {
"$(dotnet|6.0|product-version)-cbl-mariner1.0": {
"docType": "Undocumented"
},
"6.0-cbl-mariner1.0": {
"docType": "Undocumented"
}
},
"platforms": [
{
"dockerfile": "src/runtime-deps/6.0/cbl-mariner1.0/amd64",
"dockerfileTemplate": "eng/dockerfile-templates/runtime-deps/6.0/Dockerfile.mariner",
"os": "linux",
"osVersion": "cbl-mariner1.0",
"tags": {
"$(dotnet|6.0|product-version)-cbl-mariner1.0-amd64": {
"docType": "Undocumented"
},
"6.0-cbl-mariner1.0-amd64": {
"docType": "Undocumented"
}
}
}
]
}
]
},
@ -1918,6 +1945,36 @@
}
]
},
{
"productVersion": "$(dotnet|6.0|product-version)",
"sharedTags": {
"$(dotnet|6.0|product-version)-cbl-mariner1.0": {
"docType": "Undocumented"
},
"6.0-cbl-mariner1.0": {
"docType": "Undocumented"
}
},
"platforms": [
{
"buildArgs": {
"REPO": "$(Repo:runtime-deps)"
},
"dockerfile": "src/runtime/6.0/cbl-mariner1.0/amd64",
"dockerfileTemplate": "eng/dockerfile-templates/runtime/6.0/Dockerfile.mariner",
"os": "linux",
"osVersion": "cbl-mariner1.0",
"tags": {
"$(dotnet|6.0|product-version)-cbl-mariner1.0-amd64": {
"docType": "Undocumented"
},
"6.0-cbl-mariner1.0-amd64": {
"docType": "Undocumented"
}
}
}
]
},
{
"productVersion": "$(dotnet|6.0|product-version)",
"platforms": [
@ -3151,6 +3208,36 @@
}
]
},
{
"productVersion": "$(dotnet|6.0|product-version)",
"sharedTags": {
"$(dotnet|6.0|product-version)-cbl-mariner1.0": {
"docType": "Undocumented"
},
"6.0-cbl-mariner1.0": {
"docType": "Undocumented"
}
},
"platforms": [
{
"buildArgs": {
"REPO": "$(Repo:runtime)"
},
"dockerfile": "src/aspnet/6.0/cbl-mariner1.0/amd64",
"dockerfileTemplate": "eng/dockerfile-templates/aspnet/6.0/Dockerfile.mariner",
"os": "linux",
"osVersion": "cbl-mariner1.0",
"tags": {
"$(dotnet|6.0|product-version)-cbl-mariner1.0-amd64": {
"docType": "Undocumented"
},
"6.0-cbl-mariner1.0-amd64": {
"docType": "Undocumented"
}
}
}
]
},
{
"productVersion": "$(dotnet|6.0|product-version)",
"platforms": [
@ -4426,6 +4513,36 @@
}
]
},
{
"productVersion": "$(sdk|6.0|product-version)",
"sharedTags": {
"$(sdk|6.0|product-version)-cbl-mariner1.0": {
"docType": "Undocumented"
},
"6.0-cbl-mariner1.0": {
"docType": "Undocumented"
}
},
"platforms": [
{
"buildArgs": {
"REPO": "$(Repo:aspnet)"
},
"dockerfile": "src/sdk/6.0/cbl-mariner1.0/amd64",
"dockerfileTemplate": "eng/dockerfile-templates/sdk/6.0/Dockerfile.mariner",
"os": "linux",
"osVersion": "cbl-mariner1.0",
"tags": {
"$(sdk|6.0|product-version)-cbl-mariner1.0-amd64": {
"docType": "Undocumented"
},
"6.0-cbl-mariner1.0-amd64": {
"docType": "Undocumented"
}
}
}
]
},
{
"productVersion": "$(sdk|6.0|product-version)",
"platforms": [

Просмотреть файл

@ -22,14 +22,16 @@
"aspnet|5.0|linux|arm64|sha": "fc18b588eebac0a40cac2abbbd2755b2e96e3c799fd6f51f10da096e3048f060d1473fe9fefe5269142d697bd01db65c55fb67cc823f8d4461ad195f0691a557",
"aspnet|5.0|win|x64|sha": "e9986ac62e7b28fb09a7d1346b1b1c98e8e55979c4a51c99ff929200c843c431f6a2fea6441432a5f8de82c42692d44cfc69b4ff795806da2c7d4ab9ff460459",
"aspnet|6.0|build-version": "6.0.0-preview.4.21253.5",
"aspnet|6.0|linux-musl|x64|sha": "861d46655f58d911a63410cda1641852bc578fc4565462a690629ee835074f9f52e0c9922180b4df79aab4283c9ba474db626629d57627ca2a05b75edba9d247",
"aspnet|6.0|linux-musl|arm|sha": "e829ccc67d4c00a790d4d898b1d0541020fbc1f00dce4c311191c4684cfd6788746cd171512348f265c80b768b877ba912cf0709efbad9ee4aa7cf6442576eae",
"aspnet|6.0|linux-musl|arm64|sha": "9ea8cf9b8e2b81dc25b01ad55ea97de9e68d721c2643283b83009601a0f4c4bcc98b18bbf21474638380ee9abede795ce266b5c0b5f1e3dd0c265ae131d7858d",
"aspnet|6.0|linux|arm|sha": "6d4741f71ae38e5864f54c7cbb42dcef85727e631771a7789ecc7307e1c74fd90d9dcc543329de7b51786472c77c60d9d39368faa5e9431708c56ae2ec16a20c",
"aspnet|6.0|linux|x64|sha": "249db1382db95b9e60e4068c253c5381b2b37f30cf815471b623584b690a09ae5f04ef4085e02d2a2950041682188997b1f8e39bad6d5ecc05fb239576ffc1f7",
"aspnet|6.0|linux|arm64|sha": "ab0aa51b272ebcaeb61e1a24e8385b8e4b7ad807576ebdf2ceb76077e517156f6a4f7303cc54198965f98647b99fdb62b6a6f6465e7ed183662561f918664b0a",
"aspnet|6.0|win|x64|sha": "0c5900bf14a911da5e1de3e8d19bb4508439fb08fea743b47ca7523a0586261fc253ff509c3280a0fb646c6aff20d3b981b842ae5a39bd0c5e2dce1eada4769e",
"aspnet|6.0|build-version": "6.0.0-preview.5.21301.17",
"aspnet|6.0|linux-musl|x64|sha": "9e781624c19261096bbd75be5fec301c3662774cb984db704910e9b8e20ba5dabd046e3aeca66a59b3f334e49e51574b76a108514bf303070a38794f10420869",
"aspnet|6.0|linux-musl|arm|sha": "6b9f8b85d492978f2ea2b9ab7e7d9e7a0a52a7d7cd78902b664920bb78baea29f57f0082416191c5cf6a460a2d3f8bbcbd87cbf8051ff6935ccbba69b0725ef8",
"aspnet|6.0|linux-musl|arm64|sha": "634c40ab650394984b9f7320a2fe6bac72f1838b9a73bba87773e3a63834a3bb225862b4405fecfa454694163547dd3c4d073d79aaabed80bebff765140364a6",
"aspnet|6.0|linux-rpm|x64|sha": "d44afc5ce41dba54cabdf9692ff3c32b8dc451b6658bee25b2bd52903b92d1bb5dcbaefde5d182e5c165718c18d8f156029591270053f4d01a46058715fd39c3",
"aspnet|6.0|linux|arm|sha": "f421f31c829b6f8440acb0b2d5b6ced1aad40ebec9690cee517616268d8399799662567afae4749ac91755176c45a85653cbdda6b73336b17ccd15c0190e63d2",
"aspnet|6.0|linux|x64|sha": "4f21c8ca94d0403b5023696d5862585fdaf2d8111a5416dc07dc150450bf89bc96e0f554e5213e66daac467166af8bfe68f2c4de2d5019ed755230b89337582d",
"aspnet|6.0|linux|arm64|sha": "877809d707c83f6275a610548e134ca614b3b63075c49728af2060ba49bfd20699b44ea22680ac55c5975486c9df4f0da7bfe1f0110b34056aa8aa4295b1f485",
"aspnet|6.0|win|x64|sha": "99e7a611582c63410f334954edfa9758fedada8dfbbde8eb8c3efc2c1996bda8eaa6197b2617dbe3c880b7db814df33249ed378ab20603015fce48360c65f8e8",
"aspnet-runtime-targeting-pack|6.0|linux-rpm|x64|sha": "fa95a70707bfa5fcd09558812917cff09680052021de080a26e717755a045fb0572f82c4b6f1c63827d80a7d4b916afd3327e10d73707e364fd93c9e24e8f23c",
"dotnet|2.1|product-version": "2.1.28",
"dotnet|3.1|product-version": "3.1.16",
@ -42,6 +44,8 @@
"lzma|2.1|sha": "15f32f5255e9ce97f9152e9473f0e142b07392c2cfdd857b85f99499444cedf5b6321e21ddb9ebe021baa161b4519af52b068f919f31b4b587888a0bd78249a9",
"netstandard-targeting-pack-2.1.0|linux-rpm|x64|sha": "fab41a86b9182b276992795247868c093890c6b3d5739376374a302430229624944998e054de0ff99bddd9459fc9543636df1ebd5392db069ae953ac17ea2880",
"powershell|3.1|build-version": "7.0.6",
"powershell|3.1|Linux.Alpine|sha": "82e8aab9214ec98200b9abfd0c3efd1b693947f18636dd0c37e30db1476aad8a959e58268aafb26d980fef76c0fac9dc58488278d9c09b179e5b922d290f83a8",
"powershell|3.1|Linux|arm32|sha": "3ae56056bfe1b3500bea49973833b31f61cde7ae8662e4b608af08a55e45e1a2d33a77769f13b943366751f5e30350314ee5a0417975c32f6b021a1ea8da4af4",
@ -85,14 +89,20 @@
"runtime|5.0|linux|arm64|sha": "a0c20d1530c29021fe4d483611f3f9b71a605f17b81b96aef5c07878795483ea5dae85a5e18c3ad54147a30897d389d26454298ed60d11944477ecd452c60638",
"runtime|5.0|win|x64|sha": "da39eae02b0e94d700808392fbb25f0db21584a0cb238ee4e9cb0726c181fd62dd37e6cb532e459ec0d484f63330dba7a7ed2bfea06717f48546d7caedd4dcfa",
"runtime|6.0|build-version": "6.0.0-preview.4.21253.7",
"runtime|6.0|linux-musl|x64|sha": "5e837bafe7a5027e0b7abf9f68724d39dd4aa7f04ef3e04de3304848ffb7f50fa3b975ca08163a7b1e84fc1945061516ed617b224539ff159c31674ad12702e0",
"runtime|6.0|linux-musl|arm|sha": "2cb28f12114248fd6e068d80f249dc322d5c1d889d4cda663528224face978916c2e820fe7eddaf5239da146f804cab62efb2309f186815a26e894523ab396ce",
"runtime|6.0|linux-musl|arm64|sha": "711f9d17219b71dabcad305f3cb5f5a9c25891908ae9410ca8af3d3afba932473daca2a221fdf7338ec08875770f7d166a0836c287bc5b7c1bd856a0347d975d",
"runtime|6.0|linux|arm|sha": "9006314540937845adb3e8746fda48037bbbfb28cd76eeb66655d1d1a92014d979256cb78b08f5f85fe8b5b8952a10b3c152be99b7dda3b2bfe1ecec5935126d",
"runtime|6.0|linux|x64|sha": "baa7a1f8ea64ff93850b4e9ef44ba3af2e7ea8dd72354e70a73147e630fca97fb8e7f4f7ef963b0f7067baaf26c29e002a330663d32ee2cfe3bd2a0049841f6b",
"runtime|6.0|linux|arm64|sha": "69b97e6e2a98acf0dc81ceeed4bb4ff098edcdad7ce459068c1ba4393f3e6db7d6f4df75c7e41da65ac984daa9ade8a14b8277175ac695737a2a03406598c541",
"runtime|6.0|win|x64|sha": "2d5e22a35dcd1d8478815a3ca1dedf47cce881f40e78375f8a759e31f4a6527cc601acda1c8066e7c1441243561b6cbadd4a04d41c00bdf3c66e84789baf7e22",
"runtime|6.0|build-version": "6.0.0-preview.5.21301.5",
"runtime|6.0|linux-musl|x64|sha": "dab1b9a17a332a384777fe0d81c72bf62968b66adcf68e76e551ba3ae06dce6821dc4dc25ecc3756fd0dd360bad56b98a0c0c353c7a6a3e88e8c55e8352b02ce",
"runtime|6.0|linux-musl|arm|sha": "0313e8fd504500003008d87ba89918d81a66d218c46de1bb614b6f79946c019cb8966999ae7d1f2ee4385af43afa8bde28c5312cd6821fbca09e8aa21b7d37a8",
"runtime|6.0|linux-musl|arm64|sha": "c2fb6c441f3af0d579a64f63e5bc781218ba82a5fa8cc44e46adb44a3099f71391f03fc5c67755eea92b99d41130cfa64454204ef78f8394988ff2da32898239",
"runtime|6.0|linux-rpm|x64|sha": "aed7952c9dbaad109b91dfb7a2812a9031fc19d8f52373dcadf05d4135b2aaa261fbbb0fbed8e67f3aa994c257eb6c90a0377eb4b02cdf32a129f934e63caf98",
"runtime|6.0|linux|arm|sha": "7fc26829ad0d4e9c76e520ef9ddff0bfbcccc44b6562b4cfb149095e5d6ef83e704f9b533825ca176a492305bbbc8afa4e6554ebe82de42bfc1c0021b147dbf1",
"runtime|6.0|linux|x64|sha": "69b91743bf79f44da0bb82f9d36f77e12ef2889e11badcf096734a8c98819a79e83f9d92cbb9f82584e8062089df52db9e4675bc143fc46ed3a31029d8de6df7",
"runtime|6.0|linux|arm64|sha": "13d58229e85005ecc1e890052744b8bb3a8e1f538bbe716e9a9c4dea9a459d6bd5e7b733b2eb0b29e96d32e27eeb11f830fa7a52eac7879550e7df97ea73b90e",
"runtime|6.0|win|x64|sha": "79ec387b89400e21426493736e268ad7d4f0bdb73e1742af92623e668a34f31cd93135276e7fab436faae994d34ebd41b1d8e2a83ed8933f4f2a452362219dc5",
"runtime-apphost-pack|6.0|linux-rpm|x64|sha": "c85960f3030dcd8220dfa85be6ebe6d50e8e636d3306cc77662f1894dbce1685381f06e92b2a3203af67963d21e3f5704e34fe5c65baa684f57d7bef2746084f",
"runtime-deps-cm.1|6.0|linux-rpm|x64|sha": "1de17fbbf4940cb79a45d0cb18d318b8251f49a4ab1a28765294f1ac3479f035afd61945cfc5dd6cec189edb401d32993411e2f83e536c14df7be2a1961a8616",
"runtime-host|6.0|linux-rpm|x64|sha": "688fef94c4d8fb335b063d11e9ef850abf039561e65bd0a8e5c202e914a52daa65472e51bec75201c602349a2aa210df7d3e6b69a5d98a35575ae857aca15524",
"runtime-hostfxr|6.0|linux-rpm|x64|sha": "92f7db86402f4f3353dc2faaf5c26b88459cff87c25dececd285802a26a370b2f8baa88d662cae2977b4ee688432fd8ddde5b7652f0bed92f17a9962e44a0e18",
"runtime-targeting-pack|6.0|linux-rpm|x64|sha": "3f9b286f30334d2219a156a97635d1761873a85fac512e2ed319ba3b79ac12f5a5ed7b29e1b7f4a48e3ca651c00e1c41a21a2f0466a833a3889e276e6d1b593a",
"sdk|2.1|build-version": "2.1.816",
"sdk|2.1|product-version": "2.1.816",
@ -117,14 +127,15 @@
"sdk|5.0|linux|x64|sha": "81cd7a3550a262d5c907030677429fa9a1cb515071274931ab760bd8bb2a14f40c9384c8757e1c1aa681b1de22035f16bf20b41ed208becd054cc9bb1f620322",
"sdk|5.0|win|x64|sha": "e16e06a9da022c2867aa3dfc0a3d0f278ca59a08991c066ebd3fb4fe8790639b74c9b352922e9b7a58cdce644b5ab0b15d995b8717426f3cd13053bc3d8c1dc5",
"sdk|6.0|build-version": "6.0.100-preview.4.21255.9",
"sdk|6.0|product-version": "6.0.100-preview.4",
"sdk|6.0|linux-musl|arm|sha": "4f677ceeb3f6dd2d92c6865d6864619519dd44284f52fe5ad7534b2d5894e5342152a835b2dbf16dbcc954b49e5dc72037eef2fb0c7a4af94a89f4fa6a0c6db9",
"sdk|6.0|linux-musl|arm64|sha": "f2046f3fb7513da68c628faf119830e9618e19858b0b608fb38df91ee060b642243e89221f622fe4c7c09a745bc997611d4deed5ed9d1a2a2de08c864df67467",
"sdk|6.0|linux-musl|x64|sha": "101db50031fffb064d6ed86c496762c0cb19c0fb32e5650d1965f005b256e5401c6e7665506eaadf972eee61962d4a1e8c2f55ed033b82fea6f458ad59230338",
"sdk|6.0|linux|arm|sha": "5207f2842ec70fc6b428e20d25fe9b11202c593db8095b04d8f67a1ab2f445675229faa6eca9f07746d98a70f2cb891b5c6f65a1fd559ee1b8201be98d34e481",
"sdk|6.0|linux|arm64|sha": "40dbb1cf48f7f27ba95e36b5638ce5529cdba8bbfb03b2ad84e03924067f17ecc1de12132a66bb07f6b432d247bfb80e86cda7f7832d34565b880acc65940321",
"sdk|6.0|linux|x64|sha": "9b4554f9c223ff70083618da7c12a70686d39f7b413583c6a7449bfbb5e871ef281b3f692eefca53864ea57217685bf4d7f80383015b2462666a0a26376e0f97",
"sdk|6.0|win|x64|sha": "0dce469c5b6d4a83555e966556c5b8c12f6598f14a5221c5757f77e874f39834d7342fbb0ec928eb659ab8685b944b6845e17495df4a5a2eca83b9986f716c27"
"sdk|6.0|build-version": "6.0.100-preview.5.21308.63",
"sdk|6.0|product-version": "6.0.100-preview.5",
"sdk|6.0|linux-musl|arm|sha": "45b9cb4c90f03ce67f1714c631edf7d7ce068b421324ff7854e8d06b662e0101a810091831c408e5853acae462d3033b4d38f51425543d3ab93e2d6e41b1ad89",
"sdk|6.0|linux-musl|arm64|sha": "3a4d465cbf28be5e41f6194e8c51a149a07594cee36804d8e02c6d98723174dd64f6ca35ab53a23a48e74bf252fd941d5ac17baf59b74a121e8ecd7cbcb0c8a2",
"sdk|6.0|linux-musl|x64|sha": "3f0fa664d5317f4a8459a71d69006647d493e5841c0cf45e662d525506c30ddf04320d8900af599e2a9ee6aa463bf4979c50f8e9a5c3f8ff58a81c1d8dfb86cf",
"sdk|6.0|linux-rpm|x64|sha": "1ae7b9353ecba20453694e42a3ecf06d6a8e2f7729821450008b0315cfe2984c0415d2eb4281e9315118d29b8227664709d66ee58a05eca89602406b1bc12792",
"sdk|6.0|linux|arm|sha": "1a7a60db3e7eca4e9839920413891c91689f3ae4658a4406cba85da56dab05ba4176eea4b54bedaf7671ebc6159f430ed91d9750021aa8d81bdf068ec779ccfd",
"sdk|6.0|linux|arm64|sha": "e46f6e7f4f6cbeeeaf8d3be46bfb505b367683d38cab210e53b7b027b9d0ce54040060acda6f0c134b294bd894f5c009ceae33ad03ff2e6ef0b9c68b758e8081",
"sdk|6.0|linux|x64|sha": "110800e12953601dbe5001778a5ae2d4d88751ad72fedce976c2228fe2f2b3b50162b91ee63dce9ee7ed08599d067b0bab9cfaed9b0467ce4da81ee4acb0c9ab",
"sdk|6.0|win|x64|sha": "c75b7a70de65d0a20e60fd1e021926ca306350bf0cc8489b5d96a7904471a30f4381621028c4f703641242cc7cebe29eea1761cfb25ef64268b7bbb422072dcd"
}
}

Просмотреть файл

@ -0,0 +1,15 @@
ARG REPO=mcr.microsoft.com/dotnet/runtime
FROM $REPO:6.0-cbl-mariner1.0-amd64
ENV \
# ASP.NET Core version
ASPNET_VERSION=6.0.0-preview.5.21301.17 \
# Set the default console formatter to JSON
Logging__Console__FormatterName=Json
# Install ASP.NET Core
RUN curl -SL --output aspnetcore.rpm https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNET_VERSION/aspnetcore-runtime-$ASPNET_VERSION-x64.rpm \
&& dotnet_sha512='d44afc5ce41dba54cabdf9692ff3c32b8dc451b6658bee25b2bd52903b92d1bb5dcbaefde5d182e5c165718c18d8f156029591270053f4d01a46058715fd39c3' \
&& echo "$dotnet_sha512 aspnetcore.rpm" | sha512sum -c - \
&& rpm --install aspnetcore.rpm \
&& rm aspnetcore.rpm

Просмотреть файл

@ -0,0 +1,28 @@
FROM cblmariner.azurecr.io/base/core:1.0
RUN tdnf install -y \
ca-certificates \
\
# .NET dependencies
glibc \
icu \
krb5 \
libgcc \
libstdc++ \
openssl-libs \
zlib \
&& tdnf clean all
# Install dotnet-runtime-deps package
RUN dotnet_version=6.0.0-preview.5.21301.5 \
&& curl -SL --output dotnet-runtime-deps.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$dotnet_version/dotnet-runtime-deps-$dotnet_version-cm.1-x64.rpm \
&& dotnet_sha512='1de17fbbf4940cb79a45d0cb18d318b8251f49a4ab1a28765294f1ac3479f035afd61945cfc5dd6cec189edb401d32993411e2f83e536c14df7be2a1961a8616' \
&& echo "$dotnet_sha512 dotnet-runtime-deps.rpm" | sha512sum -c - \
&& rpm --install dotnet-runtime-deps.rpm \
&& rm dotnet-runtime-deps.rpm
ENV \
# Configure web servers to bind to port 80 when present
ASPNETCORE_URLS=http://+:80 \
# Enable detection of running in a container
DOTNET_RUNNING_IN_CONTAINER=true

Просмотреть файл

@ -0,0 +1,23 @@
ARG REPO=mcr.microsoft.com/dotnet/runtime-deps
FROM $REPO:6.0-cbl-mariner1.0-amd64
# Install .NET
ENV DOTNET_VERSION=6.0.0-preview.5.21301.5
RUN curl -SL --output dotnet-host.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-host-$DOTNET_VERSION-x64.rpm \
&& dotnet_sha512='688fef94c4d8fb335b063d11e9ef850abf039561e65bd0a8e5c202e914a52daa65472e51bec75201c602349a2aa210df7d3e6b69a5d98a35575ae857aca15524' \
&& echo "$dotnet_sha512 dotnet-host.rpm" | sha512sum -c - \
\
&& curl -SL --output dotnet-hostfxr.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-hostfxr-$DOTNET_VERSION-x64.rpm \
&& dotnet_sha512='92f7db86402f4f3353dc2faaf5c26b88459cff87c25dececd285802a26a370b2f8baa88d662cae2977b4ee688432fd8ddde5b7652f0bed92f17a9962e44a0e18' \
&& echo "$dotnet_sha512 dotnet-hostfxr.rpm" | sha512sum -c - \
\
&& curl -SL --output dotnet-runtime.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-runtime-$DOTNET_VERSION-x64.rpm \
&& dotnet_sha512='aed7952c9dbaad109b91dfb7a2812a9031fc19d8f52373dcadf05d4135b2aaa261fbbb0fbed8e67f3aa994c257eb6c90a0377eb4b02cdf32a129f934e63caf98' \
&& echo "$dotnet_sha512 dotnet-runtime.rpm" | sha512sum -c - \
\
&& rpm --install dotnet-host.rpm dotnet-hostfxr.rpm dotnet-runtime.rpm \
&& rm dotnet-host.rpm dotnet-hostfxr.rpm dotnet-runtime.rpm \
\
## Manually configure symbol link due to https://github.com/dotnet/runtime/issues/53543
&& ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

Просмотреть файл

@ -0,0 +1,64 @@
ARG REPO=mcr.microsoft.com/dotnet/aspnet
FROM $REPO:6.0-cbl-mariner1.0-amd64
ENV \
# Unset ASPNETCORE_URLS from aspnet base image
ASPNETCORE_URLS= \
# Do not generate certificate
DOTNET_GENERATE_ASPNET_CERTIFICATE=false \
# Do not show first run text
DOTNET_NOLOGO=true \
# SDK version
DOTNET_SDK_VERSION=6.0.100-preview.5.21308.63 \
# Enable correct mode for dotnet watch (only mode supported in a container)
DOTNET_USE_POLLING_FILE_WATCHER=true \
# Unset Logging__Console__FormatterName from aspnet base image
Logging__Console__FormatterName= \
# Skip extraction of XML docs - generally not useful within an image/container - helps performance
NUGET_XMLDOC_MODE=skip \
# PowerShell telemetry for docker image usage
POWERSHELL_DISTRIBUTION_CHANNEL=PSDocker-DotnetSDK-CBL-Mariner-1.0
RUN tdnf install -y \
git \
&& tdnf clean all
# Install .NET SDK
RUN curl -SL --output dotnet.rpm https://dotnetcli.azureedge.net/dotnet/Sdk/$DOTNET_SDK_VERSION/dotnet-sdk-$DOTNET_SDK_VERSION-x64.rpm \
&& dotnet_sha512='1ae7b9353ecba20453694e42a3ecf06d6a8e2f7729821450008b0315cfe2984c0415d2eb4281e9315118d29b8227664709d66ee58a05eca89602406b1bc12792' \
&& echo "$dotnet_sha512 dotnet.rpm" | sha512sum -c - \
\
&& curl -SL --output apphost.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-apphost-pack-$DOTNET_VERSION-x64.rpm \
&& dotnet_sha512='c85960f3030dcd8220dfa85be6ebe6d50e8e636d3306cc77662f1894dbce1685381f06e92b2a3203af67963d21e3f5704e34fe5c65baa684f57d7bef2746084f' \
&& echo "$dotnet_sha512 apphost.rpm" | sha512sum -c - \
\
&& curl -SL --output targeting-pack.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-targeting-pack-$DOTNET_VERSION-x64.rpm \
&& dotnet_sha512='3f9b286f30334d2219a156a97635d1761873a85fac512e2ed319ba3b79ac12f5a5ed7b29e1b7f4a48e3ca651c00e1c41a21a2f0466a833a3889e276e6d1b593a' \
&& echo "$dotnet_sha512 targeting-pack.rpm" | sha512sum -c - \
\
&& curl -SL --output aspnetcore-targeting-pack.rpm https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNET_VERSION/aspnetcore-targeting-pack-$ASPNET_VERSION.rpm \
&& dotnet_sha512='fa95a70707bfa5fcd09558812917cff09680052021de080a26e717755a045fb0572f82c4b6f1c63827d80a7d4b916afd3327e10d73707e364fd93c9e24e8f23c' \
&& echo "$dotnet_sha512 aspnetcore-targeting-pack.rpm" | sha512sum -c - \
\
&& curl -SL --output netstandard-targeting-pack.rpm https://dotnetcli.azureedge.net/dotnet/Runtime/3.1.0/netstandard-targeting-pack-2.1.0-x64.rpm \
&& dotnet_sha512='fab41a86b9182b276992795247868c093890c6b3d5739376374a302430229624944998e054de0ff99bddd9459fc9543636df1ebd5392db069ae953ac17ea2880' \
&& echo "$dotnet_sha512 netstandard-targeting-pack.rpm" | sha512sum -c - \
\
&& rpm --install dotnet.rpm apphost.rpm targeting-pack.rpm aspnetcore-targeting-pack.rpm netstandard-targeting-pack.rpm \
&& rm dotnet.rpm apphost.rpm targeting-pack.rpm aspnetcore-targeting-pack.rpm netstandard-targeting-pack.rpm \
# Trigger first run experience by running arbitrary cmd
&& dotnet help
# Install PowerShell global tool
RUN powershell_version=7.2.0-preview.6 \
&& curl -SL --output PowerShell.Linux.x64.$powershell_version.nupkg https://pwshtool.blob.core.windows.net/tool/$powershell_version/PowerShell.Linux.x64.$powershell_version.nupkg \
&& powershell_sha512='f241505d1dd976faefa3a8a14bb57f43be057fcbf2f199551d9abb589f64436d28a69978baaa51f91e840da5dc36f7218cbc670bbcd0810c3b8e5fdefae88142' \
&& echo "$powershell_sha512 PowerShell.Linux.x64.$powershell_version.nupkg" | sha512sum -c - \
&& mkdir -p /usr/share/powershell \
&& dotnet tool install --add-source / --tool-path /usr/share/powershell --version $powershell_version PowerShell.Linux.x64 \
&& dotnet nuget locals all --clear \
&& rm PowerShell.Linux.x64.$powershell_version.nupkg \
&& ln -s /usr/share/powershell/pwsh /usr/bin/pwsh \
&& chmod 755 /usr/share/powershell/pwsh \
# To reduce image size, remove the copy nupkg that nuget keeps.
&& find /usr/share/powershell -print | grep -i '.*[.]nupkg$' | xargs rm

Просмотреть файл

@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
@ -58,6 +59,21 @@ namespace Microsoft.DotNet.Docker.Tests
base.VerifyCommonEnvironmentVariables(imageData, variables);
}
[DotNetTheory]
[MemberData(nameof(GetImageData))]
public void VerifyPackageInstallation(ProductImageData imageData)
{
if (!(imageData.OS.Contains("cbl-mariner") && imageData.Version.Major >= 6))
{
return;
}
VerifyExpectedInstalledRpmPackages(
imageData,
GetExpectedRpmPackagesInstalled(imageData)
.Concat(RuntimeImageTests.GetExpectedRpmPackagesInstalled(imageData)));
}
public static EnvironmentVariableInfo GetAspnetVersionVariableInfo(ProductImageData imageData, DockerHelper dockerHelper)
{
string versionEnvName = null;
@ -78,5 +94,11 @@ namespace Microsoft.DotNet.Docker.Tests
return null;
}
internal static string[] GetExpectedRpmPackagesInstalled(ProductImageData imageData) =>
new string[]
{
$"aspnetcore-runtime-{imageData.VersionString}"
};
}
}

Просмотреть файл

@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
using Xunit.Abstractions;
@ -53,6 +54,40 @@ namespace Microsoft.DotNet.Docker.Tests
Assert.Empty(output);
}
private IEnumerable<string> GetInstalledRpmPackages(ProductImageData imageData)
{
// Get list of installed RPM packages
string command = $"bash -c \"rpm -qa | sort\"";
string installedPackages = DockerHelper.Run(
image: imageData.GetImage(ImageType, DockerHelper),
command: command,
name: imageData.GetIdentifier("PackageInstallation"));
return installedPackages.Split(Environment.NewLine);
}
protected void VerifyExpectedInstalledRpmPackages(
ProductImageData imageData, IEnumerable<string> expectedPackages)
{
foreach (string expectedPackage in expectedPackages)
{
// Example package name: dotnet-runtime-6.0-6.0.0-0.1.preview.5.21270.12.x86_64
string prefix;
if (expectedPackage.EndsWith(imageData.VersionString))
{
prefix = $"{expectedPackage}-{imageData.VersionString}.";
}
else
{
prefix = expectedPackage;
}
bool installed = GetInstalledRpmPackages(imageData).Any(pkg => pkg.StartsWith(prefix));
Assert.True(installed, $"Package '{expectedPackage}' is not installed.");
}
}
public static IEnumerable<EnvironmentVariableInfo> GetCommonEnvironmentVariables()
{
yield return new EnvironmentVariableInfo("DOTNET_RUNNING_IN_CONTAINER", "true");

Просмотреть файл

@ -23,5 +23,25 @@ namespace Microsoft.DotNet.Docker.Tests
{
base.VerifyCommonEnvironmentVariables(imageData);
}
[DotNetTheory]
[MemberData(nameof(GetImageData))]
public void VerifyPackageInstallation(ProductImageData imageData)
{
if (!(imageData.OS.Contains("cbl-mariner") && imageData.Version.Major >= 6))
{
return;
}
VerifyExpectedInstalledRpmPackages(
imageData,
GetExpectedRpmPackagesInstalled(imageData));
}
internal static string[] GetExpectedRpmPackagesInstalled(ProductImageData imageData) =>
new string[]
{
$"dotnet-runtime-deps-{imageData.VersionString}"
};
}
}

Просмотреть файл

@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
@ -47,10 +48,33 @@ namespace Microsoft.DotNet.Docker.Tests
base.VerifyCommonEnvironmentVariables(imageData, variables);
}
[DotNetTheory]
[MemberData(nameof(GetImageData))]
public void VerifyPackageInstallation(ProductImageData imageData)
{
if (!(imageData.OS.Contains("cbl-mariner") && imageData.Version.Major >= 6))
{
return;
}
VerifyExpectedInstalledRpmPackages(
imageData,
GetExpectedRpmPackagesInstalled(imageData)
.Concat(RuntimeDepsImageTests.GetExpectedRpmPackagesInstalled(imageData)));
}
public static EnvironmentVariableInfo GetRuntimeVersionVariableInfo(ProductImageData imageData, DockerHelper dockerHelper)
{
string version = imageData.GetProductVersion(DotNetImageType.Runtime, dockerHelper);
return new EnvironmentVariableInfo("DOTNET_VERSION", version);
}
internal static string[] GetExpectedRpmPackagesInstalled(ProductImageData imageData) =>
new string[]
{
"dotnet-host",
$"dotnet-hostfxr-{imageData.VersionString}",
$"dotnet-runtime-{imageData.VersionString}",
};
}
}

Просмотреть файл

@ -161,6 +161,19 @@ namespace Microsoft.DotNet.Docker.Tests
return;
}
// Disable test on Windows due to PowerShell crash (https://github.com/dotnet/runtime/issues/53298)
if (imageData.Version.Major == 6 && !DockerHelper.IsLinuxContainerModeEnabled)
{
return;
}
// Skip test on CBL-Mariner for 6.0. Since installation is done via RPM package, we just need to verify the package installation
// was done (handled by VerifyPackageInstallation test). There's no need to check the actual contents of the package.
if (imageData.Version.Major == 6 && imageData.OS.Contains("cbl-mariner"))
{
return;
}
if (!(imageData.Version.Major >= 5 ||
(imageData.Version.Major >= 3 &&
(imageData.SdkOS.StartsWith(OS.AlpinePrefix) || !DockerHelper.IsLinuxContainerModeEnabled))))
@ -208,6 +221,28 @@ namespace Microsoft.DotNet.Docker.Tests
Assert.False(hasFileContentDifference, "There are file content differences. Check the log output.");
}
[DotNetTheory]
[MemberData(nameof(GetImageData))]
public void VerifyPackageInstallation(ProductImageData imageData)
{
if (!(imageData.OS.Contains("cbl-mariner") && imageData.Version.Major >= 6))
{
return;
}
VerifyExpectedInstalledRpmPackages(
imageData,
new string[]
{
$"dotnet-sdk-{imageData.VersionString}",
$"dotnet-targeting-pack-{imageData.VersionString}",
$"aspnetcore-targeting-pack-{imageData.VersionString}",
$"dotnet-apphost-pack-{imageData.VersionString}",
$"netstandard-targeting-pack-2.1"
}
.Concat(AspnetImageTests.GetExpectedRpmPackagesInstalled(imageData)));
}
private IEnumerable<SdkContentFileInfo> GetActualSdkContents(ProductImageData imageData)
{
string dotnetPath;

Просмотреть файл

@ -45,6 +45,7 @@ namespace Microsoft.DotNet.Docker.Tests
new ProductImageData { Version = V6_0, OS = OS.BullseyeSlim, Arch = Arch.Amd64 },
new ProductImageData { Version = V6_0, OS = OS.Focal, Arch = Arch.Amd64 },
new ProductImageData { Version = V6_0, OS = OS.Alpine313, Arch = Arch.Amd64 },
new ProductImageData { Version = V6_0, OS = OS.Mariner10, Arch = Arch.Amd64 },
new ProductImageData { Version = V6_0, OS = OS.BullseyeSlim, Arch = Arch.Arm },
new ProductImageData { Version = V6_0, OS = OS.BullseyeSlim, Arch = Arch.Arm64 },
new ProductImageData { Version = V6_0, OS = OS.Focal, Arch = Arch.Arm },

Просмотреть файл

@ -22,7 +22,8 @@
"src/runtime-deps/5.0/alpine3.13/arm32v7": 6973412,
"src/runtime-deps/6.0/bullseye-slim/amd64": 129796307,
"src/runtime-deps/6.0/bullseye-slim/arm32v7": 99237019,
"src/runtime-deps/6.0/bullseye-slim/arm64v8": 121213417
"src/runtime-deps/6.0/bullseye-slim/arm64v8": 121213417,
"src/runtime-deps/6.0/cbl-mariner1.0/amd64": 212940029
},
"dotnet/nightly/runtime": {
"src/runtime/2.1/stretch-slim/amd64": 180258057,
@ -62,7 +63,8 @@
"src/runtime/6.0/alpine3.13/arm64v8": 85403621,
"src/runtime/6.0/focal/amd64": 186940410,
"src/runtime/6.0/focal/arm32v7": 152852897,
"src/runtime/6.0/focal/arm64v8": 185087882
"src/runtime/6.0/focal/arm64v8": 185087882,
"src/runtime/6.0/cbl-mariner1.0/amd64": 276271150
},
"dotnet/nightly/aspnet": {
"src/aspnet/2.1/stretch-slim/amd64": 253015005,
@ -102,7 +104,8 @@
"src/aspnet/6.0/alpine3.13/arm64v8": 106855410,
"src/aspnet/6.0/focal/amd64": 205945177,
"src/aspnet/6.0/focal/arm32v7": 173075712,
"src/aspnet/6.0/focal/arm64v8": 206459635
"src/aspnet/6.0/focal/arm64v8": 206459635,
"src/aspnet/6.0/cbl-mariner1.0/amd64": 294595059
},
"dotnet/nightly/sdk": {
"src/sdk/2.1/stretch/amd64": 1728622878,
@ -139,7 +142,8 @@
"src/sdk/6.0/alpine3.13/arm64v8": 521464732,
"src/sdk/6.0/focal/amd64": 652648922,
"src/sdk/6.0/focal/arm32v7": 591681171,
"src/sdk/6.0/focal/arm64v8": 669929244
"src/sdk/6.0/focal/arm64v8": 669929244,
"src/sdk/6.0/cbl-mariner1.0/amd64": 823610845
},
"dotnet/nightly/monitor": {
"src/monitor/5.0/alpine/amd64": 112576244