为啥我的 dockerfile 中的 dotnet restore 步骤失败?

Posted

技术标签:

【中文标题】为啥我的 dockerfile 中的 dotnet restore 步骤失败?【英文标题】:Why does my dotnet restore step fail in my dockerfile?为什么我的 dockerfile 中的 dotnet restore 步骤失败? 【发布时间】:2021-10-21 08:07:21 【问题描述】:

我在 Visual Studio 2019 v16.11.1 中生成了一个基本的 Kubernetes Web 应用程序,它允许我自动生成一个 Dockerfile 并开始调试。但是,在切换到发布配置后,内部dotnet restore 命令执行时构建会失败。显然,在尝试从提要中提取 Nuget 包时,dotnet restore 会拒绝 Nuget 提要服务器提供的 SSL 证书。

我的问题是,我做错了什么?我从字面上是由 Visual Studio 生成的默认 Web 应用程序开始,当我尝试构建发布配置时它会自动失败。详情请看这里:

问题

以下 Dockerfile 可以在调试配置中构建,但不能在发布配置中构建。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY ["KubernetesWebApp/KubernetesWebApp.csproj", "KubernetesWebApp/"]

RUN dotnet restore "KubernetesWebApp/KubernetesWebApp.csproj"
COPY . .
WORKDIR "/src/KubernetesWebApp"
RUN dotnet build "KubernetesWebApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "KubernetesWebApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "KubernetesWebApp.dll"]

单击“调试”启动调试会话会执行以下构建,我可以调试应用程序:

docker build -f ".\KubernetesWebApp\Dockerfile" --force-rm -t kuberneteswebapp:dev --target base --label "com.microsoft.created-by=visual-studio" --label "com.microsoft.visual-studio.project-name=KubernetesWebApp" .

然而,在尝试以下构建命令时,dotnet restore 命令由于远程 SSL 证书检查失败而失败:

docker build -t kuberneteswebapp:latest -f KubernetesWebApp/Dockerfile .

这会引发以下错误:

[+] Building 7.7s (12/17)
 => [internal] load build definition from Dockerfile                                                                                          0.4s
 => => transferring dockerfile: 32B                                                                                                           0.2s
 => [internal] load .dockerignore                                                                                                             0.3s
 => => transferring context: 35B                                                                                                              0.0s
 => [internal] load metadata for mcr.microsoft.com/dotnet/core/aspnet:3.1                                                                     0.8s
 => [internal] load metadata for mcr.microsoft.com/dotnet/core/sdk:3.1                                                                        0.8s
 => [internal] load build context                                                                                                             0.3s
 => => transferring context: 644B                                                                                                             0.1s
 => [build 1/7] FROM mcr.microsoft.com/dotnet/core/sdk:3.1@sha256:aa984bf37de864afe9f34bc80e42412dd95702b94731a481821eeae364df77ae            0.2s
 => => resolve mcr.microsoft.com/dotnet/core/sdk:3.1@sha256:aa984bf37de864afe9f34bc80e42412dd95702b94731a481821eeae364df77ae                  0.2s
 => [base 1/2] FROM mcr.microsoft.com/dotnet/core/aspnet:3.1@sha256:9280563285e34929fdae56b8759d8050169b3ce125a5dced64945b3b51e79918          0.3s
 => => resolve mcr.microsoft.com/dotnet/core/aspnet:3.1@sha256:9280563285e34929fdae56b8759d8050169b3ce125a5dced64945b3b51e79918               0.3s
 => CACHED [base 2/2] WORKDIR /app                                                                                                            0.0s
 => CACHED [final 1/2] WORKDIR /app                                                                                                           0.0s
 => CACHED [build 2/7] WORKDIR /src                                                                                                           0.0s
 => CACHED [build 3/7] COPY [KubernetesWebApp/KubernetesWebApp.csproj, KubernetesWebApp/]                                                     0.0s
 => ERROR [build 4/7] RUN dotnet restore "KubernetesWebApp/KubernetesWebApp.csproj"                                                           5.5s
------
 > [build 4/7] RUN dotnet restore "KubernetesWebApp/KubernetesWebApp.csproj":
#12 3.363   Determining projects to restore...
#12 5.397 /usr/share/dotnet/sdk/3.1.412/NuGet.targets(128,5): error : Unable to load the service index for source https://api.nuget.org/v3/index.json. [/src/KubernetesWebApp/KubernetesWebApp.csproj]
#12 5.397 /usr/share/dotnet/sdk/3.1.412/NuGet.targets(128,5): error :   The SSL connection could not be established, see inner exception. [/src/KubernetesWebApp/KubernetesWebApp.csproj]
#12 5.397 /usr/share/dotnet/sdk/3.1.412/NuGet.targets(128,5): error :   The remote certificate is invalid according to the validation procedure. [/src/KubernetesWebApp/KubernetesWebApp.csproj]
------
executor failed running [/bin/sh -c dotnet restore "KubernetesWebApp/KubernetesWebApp.csproj"]: exit code: 1

认为问题是什么

认为问题出现在:

    docker 容器尝试从 nuget 提要中提取 Nuget 包, 在身份验证期间,它会检查提供的服务器证书 由于某些指定的验证程序,服务器证书验证失败。

我尝试解决的问题

我尝试了以下命令来强制应用程序下载新的基础容器映像,但无济于事:

尝试 1:

docker build --no-cache --pull -t kuberneteswebapp:latest -f KubernetesWebApp/Dockerfile .

结果:与之前相同的错误

尝试 2:

docker system prune
docker image prune -a
docker build --no-cache --pull -t kuberneteswebapp:latest -f KubernetesWebApp/Dockerfile .

结果:和之前一样的错误

这些努力都没有成功。谁能帮我?我在这里不知所措。

【问题讨论】:

您是否在使用某种代理(通常在工作中)? 我们使用 *** 来重定向我们所有的互联网流量。 由于从 Visual Studio 构建工作,您是否尝试在您的计算机上从 cmd 构建项目。 Visual Studio 可能会更改一些环境设置以处理 https 连接(TLS 1.2 问题,或忽略证书错误)。 我做了,命令行构建失败。 您是否尝试在另一台机器上构建该项目?没有提到 *** 会更好 【参考方案1】:

问题自行解决。我刚刚重新尝试了我的测试和实际项目,它现在可以工作了。这可能是软件更新或计算机重新启动。但现在一切正常。

【讨论】:

【参考方案2】:

如果您使用的是 Windows 容器,我建议您切换到 Linux 容器并再次尝试。 (您可以通过右键单击系统托盘栏中的 Docker 桌面图标来执行此操作)。

我在 GitHub 上遇到了以下问题:https://github.com/docker/for-win/issues/2760#issuecomment-430889666 我无法使用新的 ASP .NET Web API 重现您的问题

【讨论】:

以上是关于为啥我的 dockerfile 中的 dotnet restore 步骤失败?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本地 nuget 包源进行 Dockerfile dotnet restore [重复]

为啥我的模型对象在 dotnet core 2.x Razor 页面应用程序中的 Razor 页面上始终为空?

在centos7.5使用DockerFile构建镜像时报错“Error parsing reference: "microsoft/dotnet:2.2-aspnetcore-runtime

为啥Dockerfile中的cron服务不运行?

使用alpine的docker镜像下 dind 的方式安装dotnet core 的一个非dockerfile的方法

vs2017 对dockerfile的支持