NuGet 恢复在 Docker 容器内停止工作
NuGet restore stopped working inside Docker Container
当我尝试 运行 dotnet restore
作为 Dockerfile
的 RUN
指令构建它时,出现以下错误:
/src/Anonymized.Tests/Anonymized.Tests.csproj : error NU3028: Package 'Microsoft.Win32.SystemEvents 5.0.0' from source 'https://api.nuget.org/v3/index.json': The author primary signature's timestamp found a chain building issue: UntrustedRoot: self signed certificate in certificate chain [/src/Anonymized.sln]
/src/Anonymized.Tests/Anonymized.Tests.csproj : error NU3037: Package 'Microsoft.Win32.SystemEvents 5.0.0' from source 'https://api.nuget.org/v3/index.json': The author primary signature validity period has expired. [/src/Anonymized.sln]
我所有的 NuGet 包都会发生这种情况。
如果我 运行 它在容器外,它工作得很好。
我正在使用图像 mcr.microsoft.com/dotnet/sdk:5.0
。会不会是我 运行 中的 Docker 图片证书不知何故过期了?
几个小时前它一直有效。
编辑: 不确定这是否是重要信息,但这都是 运行来自 GitHub 操作的所有信息,在 Linux。
编辑:
解决方案 1:
如 github 所述,如果您的 Docker 文件与此类似:
FROM mcr.microsoft.com/dotnet/sdk:5.0
改为
FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine
,或
FROM mcr.microsoft.com/dotnet/sdk:5.0-focal
解决方案 2:
在 运行 恢复之前将此添加到您的 Docker 文件:
RUN curl -o /usr/local/share/ca-certificates/verisign.crt -SsL https://crt.sh/?d=1039083 && update-ca-certificates
出于安全原因,您可能需要下载并验证证书并将其保存到您的存储库中。
这是验证软件包时间戳所必需的证书,它默认包含在 alpine 和 focal 中,但在 debian 中缺失。
解决方案 3:
等待微软解决问题。
他们在 github 上跟踪它,Nuget 已将其状态设置为降级,直到问题得到解决:https://status.nuget.org/
原回答:
据我所知,Docker 在这种情况下是正确的。
手动下载任何 NuGet 包,即:https://www.nuget.org/api/v2/package/System.ComponentModel.Annotations/5.0.0
打开文件并查找.signature.p7s 文件并使用默认程序打开它。
它向我显示 Microsoft 的证书在当地时间今天下午 1 点过期。
我不知道为什么这对于 docker 之外的工具来说不是问题。
我知道有一种方法可以完全禁用此处解释的 NuGet 验证以及有关有效期的更多信息:
https://docs.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3028
https://docs.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3037
虽然我真的不想完全禁用检查。
可悲的是,我也不知道在这种情况下如何进行
目前问题似乎与 Debian 映像有关。
切换到基于 Ubuntu 的图像:
FROM mcr.microsoft.com/dotnet/sdk:5.0-focal
当我尝试 运行 dotnet restore
作为 Dockerfile
的 RUN
指令构建它时,出现以下错误:
/src/Anonymized.Tests/Anonymized.Tests.csproj : error NU3028: Package 'Microsoft.Win32.SystemEvents 5.0.0' from source 'https://api.nuget.org/v3/index.json': The author primary signature's timestamp found a chain building issue: UntrustedRoot: self signed certificate in certificate chain [/src/Anonymized.sln]
/src/Anonymized.Tests/Anonymized.Tests.csproj : error NU3037: Package 'Microsoft.Win32.SystemEvents 5.0.0' from source 'https://api.nuget.org/v3/index.json': The author primary signature validity period has expired. [/src/Anonymized.sln]
我所有的 NuGet 包都会发生这种情况。
如果我 运行 它在容器外,它工作得很好。
我正在使用图像 mcr.microsoft.com/dotnet/sdk:5.0
。会不会是我 运行 中的 Docker 图片证书不知何故过期了?
几个小时前它一直有效。
编辑: 不确定这是否是重要信息,但这都是 运行来自 GitHub 操作的所有信息,在 Linux。
编辑:
解决方案 1:
如 github 所述,如果您的 Docker 文件与此类似:
FROM mcr.microsoft.com/dotnet/sdk:5.0
改为
FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine
,或FROM mcr.microsoft.com/dotnet/sdk:5.0-focal
解决方案 2:
在 运行 恢复之前将此添加到您的 Docker 文件:
RUN curl -o /usr/local/share/ca-certificates/verisign.crt -SsL https://crt.sh/?d=1039083 && update-ca-certificates
出于安全原因,您可能需要下载并验证证书并将其保存到您的存储库中。 这是验证软件包时间戳所必需的证书,它默认包含在 alpine 和 focal 中,但在 debian 中缺失。
解决方案 3:
等待微软解决问题。 他们在 github 上跟踪它,Nuget 已将其状态设置为降级,直到问题得到解决:https://status.nuget.org/
原回答:
据我所知,Docker 在这种情况下是正确的。 手动下载任何 NuGet 包,即:https://www.nuget.org/api/v2/package/System.ComponentModel.Annotations/5.0.0 打开文件并查找.signature.p7s 文件并使用默认程序打开它。 它向我显示 Microsoft 的证书在当地时间今天下午 1 点过期。
我不知道为什么这对于 docker 之外的工具来说不是问题。 我知道有一种方法可以完全禁用此处解释的 NuGet 验证以及有关有效期的更多信息: https://docs.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3028 https://docs.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3037
虽然我真的不想完全禁用检查。 可悲的是,我也不知道在这种情况下如何进行
目前问题似乎与 Debian 映像有关。
切换到基于 Ubuntu 的图像:
FROM mcr.microsoft.com/dotnet/sdk:5.0-focal