Docker Compose 构建中的 Nuget 包还原错误

Nuget package restore error in Docker Compose build

我在使用 docker-compose behind proxy 构建时遇到块恢复错误。我在 docker 中为 windows 设置了代理。 Nuget 恢复适用于命令行 dotnet restore 和 visual studio 调试,但不适用于 docker-compose.

:\Program Files\dotnet\sdk.1.104\NuGet.targets(104,5): error : Unable to load the service index for source https://api.nuget.org/v3/index.json. [C:\src\WebApp.sln]
:\Program Files\dotnet\sdk.1.104\NuGet.targets(104,5): error :   An error occurred while sending the request. [C:\src\WebApp.sln]
:\Program Files\dotnet\sdk.1.104\NuGet.targets(104,5): error :   A connection with the server could not be established [C:\src\WebApp.sln]
ERROR: Service 'idenityapi' failed to build: The command 'powershell -Command $ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue'; dotnet restore -nowarn:msb3202,nu1503' r
turned a non-zero code: 1

我现在也遇到同样的错误。我已经为此工作了 2 天,但无济于事。我确定这似乎不是与网络相关的问题。我可以在我的家用笔记本电脑上加载相同的项目并进行构建。我把我的工作笔记本电脑带回家,但它没有组装好。这让我想到我的工作笔记本电脑有问题。

我打开了 fiddler,但它从未尝试点击 URL。我现在 运行 缺乏想法,不知道该怎么做。

我尝试从一个简单的 API/website 创建另一个 "template" 项目...构建良好...我添加了 Nuget 包,但它突然失败了。

我的错误信息与PS4的完全一样。

重现这个的步骤很简单。 1)创建一个新的.NET Core Web 项目 2) 启用 Docker 支持(通过新项目向导或添加上下文菜单) 3) Select 释放模式 4) 点击 Play/Debug/Go 按钮。

我和 PS4 的共同点是我们都有 "dotnet sdk 2.1.104"

已解决:
原来是网络问题。我在公司防火墙后面工作,它利用 TLS 数据包检查来分解 SSL 流量。调试时的构建过程在我的本地机器上运行为 "me",但是,发布构建(docker-compose)实际上拉下了一个 aspnetcore-build docker 图像,将您的代码复制到docker 容器,然后运行 ​​dotnet restore 为您的 docker 图像获取新的 nuget 包。这些操作可以在项目的 Docker 文件中找到。容器内的这个 "dotnet restore" 在不同的安全上下文下运行,因此被挂断了。由于 docker 网络的工作方式,我们跟踪了我很难到达的网络流量。 Fiddler 没有赶上流量。使用 wireshark,我们能够从设备级别捕获它并查看下降。它继续从我的家庭网络失败的原因是由于我们的管理程序和网络的配置。

决议:
https://api.nuget.org/v3/index.json 添加防火墙规则(首选) 要么 从云中的 VSTS 构建图像 要么 从不同的网络构建。

PS4请post回来,如果你能用同样的方法解决这个问题?花了3天的时间,我很好奇你的状态。

当我 运行 解决这个问题时 dotnet restore 添加公司证书文件解决了这个问题。 (您的情况可能相同也可能不同?)。在 RUN dotnet restore 之前,我添加到容器的证书存储区,即

ADD your-proxy-certificate-file.crt /usr/local/share/ca-certificates/your-proxy-certificate-file.crt
RUN update-ca-certificates

理论上,如果 dotnet restore 在您的本地机器上工作,您没有理由不能够配置您的容器工作(没有防火墙规则或改变网络!)。您基本上需要使用与本地计算机相同的设置将容器配置为在您的代理后面工作。

您可以检查网络适配器索引。 docker 使用列表中的最后一个。如果断开连接 - 您将无法恢复包,因为图像无法连接到互联网下载。

检查网络接口列表:

❯ Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending

更改 LAN 索引(例如,将其移到 Wi-Fi 上方):

❯ Set-NetIPInterface -InterfaceAlias 'Local Area Connection* 1' -InterfaceMetric 100

当企业 SSL 拦截阻止 nuget 包还原时,我遇到了类似的问题。但错误略有不同:“由于证书链中的错误,远程证书无效:PartialChain”

以下解决方案帮助了我:

  1. Export Windows 用于连接到 PEM 格式的 SSL 代理的证书;

  2. 将以下行添加到 Dockerfile:

    复制 ["exported_windows_cert_path_and_name.cer", "/usr/local/share/ca-certificates/cert_name.cer"]

    运行 openssl x509 -inform PEM -in '/usr/local/share/ca-certificates/cert_name.cer' -out '/usr/local/share/ca-certificates/cert_name.crt'

    运行 更新 ca 证书

也可以用DER certificate type代替PEM

我也尝试更改我的网络连接...重新创建了所有图像和容器,但它不起作用,然后我尝试了

--disable-parallel 成功了。

注意:我正在使用 docker-compose 命令来 运行 我的所有微服务,并且我在 dotnet restore 命令后立即在我的 Docker 文件中输入了 --disable-parallel