在 Windows Docker 构建中诊断来自 Chocolatey.org 的下载超时

Set*_*son 6 chocolatey docker docker-for-windows

我正在尝试组合一个可以运行 .NET 构建的 Windows Docker 容器。鉴于我需要的依赖项,最好的方法似乎是使用 Chocolatey。但是,在 Chocolatey 的安装步骤中,我在尝试运行命令时遇到下载超时

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
Run Code Online (Sandbox Code Playgroud)

完整的错误如下。

Exception calling "DownloadString" with "1" argument(s): "The operation has
timed out"
At C:\install.ps1:3 char:51
+ ... ess -Force; iex ((New-Object System.Net.WebClient).DownloadString('ht ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordE
   xception
    + FullyQualifiedErrorId : WebException
Run Code Online (Sandbox Code Playgroud)

由于多种原因,这似乎很奇怪。

  1. 我已经在我手动运行的机器上成功构建了这个 Docker 映像,但是在我们配置的构建机器上始终发生失败。
  2. 我可以 RDP 到机器上并在 docker 容器的上下文之外下载脚本,没有问题。
  3. 我可以在 Docker 容器中毫无问题地 ping Chocolatey.org。
  4. 我可以从 Docker 容器(即 google.com 或 nuget.org)中下载其他站点的内容。
  5. 我已经完全摧毁了这台构建机器并配置了一台新机器(通过 BOSH)。

结论:似乎存在某种与 Docker 相关的网络问题,它不会阻止连接到 Chocolatey.org 上的服务器,但仍然阻止从那里读取 URL 的内容。

但是,我没有用于故障排除的工具,任何想法将不胜感激。

完整的 Docker 文件

FROM microsoft/windowsservercore:1709

COPY install.ps1 /install.ps1
RUN powershell /install.ps1

ENTRYPOINT powershell
Run Code Online (Sandbox Code Playgroud)

完整安装.ps1

$ErrorActionPreference = "Stop"

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

choco install 7zip -y
choco install visualstudio2017professional -y
choco install visualstudio2017-workload-manageddesktop --includeOptional --pre -y
choco install visualstudio2017-workload-universal --includeOptional --pre -y

choco install nuget.commandline
Run Code Online (Sandbox Code Playgroud)

小智 0

解决方案 如果您有以下情况:

PowerShell v3+ .NET Framework 4.5 您只需运行以下命令(而不仅仅是一行代码)即可安装 Chocolatey:

$securityProtocolSettingsOriginal = [System.Net.ServicePointManager]::SecurityProtocol

try { # 设置 TLS 1.2 (3072),然后设置 TLS 1.1 (768),然后设置 TLS 1.0 (192),最后设置 SSL 3.0 (48) # 使用整数,因为 TLS 1.2 和 TLS 1.1 的枚举值不会存在于 . NET 4.0,即使如果安装了 .NET 4.5+,它们也是可寻址的(.NET 4.5 是就地升级)。[System.Net.ServicePointManager]::SecurityProtocol = 3072 -bor 768 -bor 192 -bor 48 } catch { Write-Warning '由于安装了旧的 .NET Framework,无法将 PowerShell 设置为使用 TLS 1.2 和 TLS 1.1。如果您看到底层连接关闭或信任错误,您可能需要执行以下一项或多项操作:(1) 升级到 .NET Framework 4.5 和 PowerShell v3,(2) 指定内部 Chocolatey 包位置(事先设置 $env:chocolateyDownloadUrl在内部安装或托管软件包),(3) 使用下载 + PowerShell 方法安装。请参阅https://chocolatey.org/install了解所有安装选项。}

iex ((New-Object System.Net.WebClient).DownloadString(' https://chocolatey.org/install.ps1 '))

[System.Net.ServicePointManager]::SecurityProtocol = $securityProtocolSettingsOriginal