Docker Compose构建中Nuget包还原错误

9

在代理后使用docker-compose构建时,我遇到了Nuget恢复错误。我已经在Windows的Docker中设置了代理。命令行dotnet restore和Visual Studio调试可以正常工作,但是使用docker-compose无法正常工作。

:\Program Files\dotnet\sdk\2.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\2.1.104\NuGet.targets(104,5): error :   An error occurred while sending the request. [C:\src\WebApp.sln]
:\Program Files\dotnet\sdk\2.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
7个回答

10
解决方案:
问题最终被确定为网络问题。我在公司使用的是企业防火墙,利用TLS数据包检查来拆分SSL流量。在调试期间构建过程运行在我的本地电脑上,但是发布构建(docker-compose)实际上会拉取aspnetcore-build docker镜像,将您的代码复制到docker容器中,然后运行dotnet restore以获取新鲜的nuget包。这些操作可以在项目的Docker文件中找到。容器内部的“dotnet restore”运行在不同的安全上下文下,因此会出现卡顿情况。我们追踪了网络流量,但由于docker网络的工作方式,这对我来说很难做到。Fiddler无法捕获流量。使用wireshark,我们能够从设备级别捕获并查看丢失的流量。之所以在我的家庭网络中仍然失败,是因为我们的虚拟化程序和网络配置。

解决方法:
添加一个防火墙规则 https://api.nuget.org/v3/index.json (首选) 或 在云端从VSTS构建镜像 或 从另一个网络构建。

PS4请回复一下是否能以同样的方式解决?我已经花了3天时间,对您的情况很感兴趣。

我仍然无法做到那个。 - prisar

5

当我在使用 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在您的本地机器上能够正常工作,那么没有理由不能配置您的容器使其正常工作(无需防火墙规则或更改网络!)。您只需要将容器配置为在代理后面工作,并使用与本地机器相同的设置。


@uosjeadad..你能详细说明什么是代理证书以及它在系统中的位置吗?请帮我添加上述内容。 - AJAY KUMAR

3

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

检查网络接口列表:

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

更改局域网的索引(例如,将其移动到 Wi-Fi 上方):

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

1
我曾经遇到类似的问题,当企业SSL拦截阻止nuget包恢复时。然而,错误略有不同:“由于证书链中的错误,远程证书无效:PartialChain”。
以下解决方案帮助了我:
  1. 导出用于连接SSL代理的Windows证书,格式为PEM;

  2. 将以下行添加到Dockerfile中:

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

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

    RUN update-ca-certificates

也可以使用DER证书类型

0

我在进行Docker构建时遇到了同样的错误,但是我的问题是由于一个糟糕的Nexus服务器无法跟上生成的请求数量。上面列出的解决方案--disable-parallel<add key='maxHttpRequestsPerSource' value='16' />确实有效,但它们会导致构建变得非常缓慢

真正的解决方案直到package-source-mapping可用才出现。 https://devblogs.microsoft.com/nuget/introducing-package-source-mapping/

这使我能够仅将必要的连接指向我的自定义Nexus服务器,其余连接则指向nuget.org,后者没有处理连接计数的问题。

这是从文章中提取的内容。

<!-- This is where installed packages will be stored locally. -->
<config>
  <add key="globalPackagesFolder" value="globalPackagesFolder" />
</config>

<!-- Define my package sources, nuget.org and contoso.com. -->
<!-- `clear` ensures no additional sources are inherited from another config file. -->
<packageSources>
  <clear />
  <!-- `key` can be any identifier for your source. -->
  <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
  <add key="contoso.com" value="https://contoso.com/packages/" />
</packageSources>

<!-- Define mappings by adding package ID patterns beneath the target source. -->
<!-- Contoso.* packages will be restored from contoso.com, everything else from nuget.org. -->
<packageSourceMapping>
  <!-- key value for <packageSource> should match key values from <packageSources> element -->
  <packageSource key="nuget.org">
    <package pattern="*" />
  </packageSource>
  <packageSource key="contoso.com">
    <package pattern="Contoso.*" />
  </packageSource>
</packageSourceMapping>

对我来说非常有效!现在我可以以正常的构建速度构建,而且不会过载仅托管1-2个专有软件包的Nexus服务器。


0

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

--disable-parallel,它起作用了。

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


0

我也遇到了同样的错误。我已经尝试了两天,但没有任何进展。我确定这似乎不是网络相关问题。我可以在家里的笔记本电脑上加载相同的项目并构建。我把我的工作笔记本电脑带回家,但它无法构建。这让我怀疑我的工作笔记本电脑出了些问题。

我打开了Fiddler,但它从未尝试过访问URL。我现在对该怎么做感到困惑。

我尝试从简单的API/网站创建另一个“模板”项目...它可以成功构建...但是当我添加Nuget Packages时,它突然失败了。

我的错误消息与PS4的完全相同。

重现此错误的步骤很容易。 1)创建新的.NET Core Web项目 2)启用Docker支持(通过新项目向导或添加上下文菜单) 3)选择发布模式 4)点击播放/调试/前往按钮。

PS4和我共享的一件事是我们都有“dotnet sdk 2.1.104”。


我对我们的反病毒程序捕获到某些东西感到怀疑。我在Windows事件日志中看到它在.之前捕获了某些东西。 - Wauna
所以,这里实际上正在发生的是docker-compose在构建时创建了一个短暂的容器。如果你运行"docker ps"命令,你可以看到容器正在启动,然后尝试从Docker容器中恢复软件包。错误消息实际上是在说“在Docker容器内部,我无法还原”。我们仍在深入研究为什么会出现这种情况... - Wauna
我尝试使用更新的BUILD镜像,但似乎也不起作用。-<DockerFile中的片段> FROM microsoft/aspnetcore-build:2.0.7-2.1.105-nanoserver-sac2016 AS build 我很希望这能解决问题,但似乎并没有。我还尝试了1.0-2.0,但也不行。下一步是尝试在容器运行时进入容器并查看为什么构建容器无法nuget restore。 - Wauna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接