docker - 在 docker 容器中运行巧克力失败
问题描述
我在 windows server 2016 上有 docker。Dockerfile 包含一些要通过巧克力安装的构建工具。每次我尝试从提到的 Dockerfile 构建图像时都会失败。巧克力工具未在容器中运行。
# Use the latest Windows Server Core image.
FROM microsoft/windowsservercore
ENV chocolateyUseWindowsCompression false
RUN powershell -Command \
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')); \
choco feature disable --name showDownloadProgress
RUN choco install visualstudio2015professional
RUN choco install qtcreator
RUN choco install curl
RUN choco install jq
RUN choco install 7zip.install
RUN choco install jfrog-cli
RUN choco install jom
Build command here.........
C:\Program Files\Docker>docker build -t test -f Dockerfile.txt .
Sending build context to Docker daemon 54.73MB
Step 1/10 : FROM microsoft/windowsservercore
latest: Pulling from microsoft/windowsservercore
3889bb8d808b: Pull complete
fb1ebf2c42b6: Pull complete
Digest: sha256:750440935dd3ef8ea148a8e4f83a0397540a8014938ae7b59eb78211da1d5969
Status: Downloaded newer image for microsoft/windowsservercore:latest
---> 7d89a4baf66c
Step 2/10 : ENV chocolateyUseWindowsCompression false
---> Running in 8a7b1fc97da5
---> 0f3c89daf01c
Removing intermediate container 8a7b1fc97da5
Step 3/10 : RUN powershell -Command iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')); choco feature disable --name showDownloadProgress
---> Running in f7088454db37
Exception calling "DownloadString" with "1" argument(s): "Unable to connect to
the remote server"
At line:1 char:1
+ iex ((new-object net.webclient).DownloadString('https://chocolatey.or ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : WebException
choco : The term 'choco' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
At line:1 char:88
+ ... .DownloadString('https://chocolatey.org/install.ps1')); choco feature ...
+ ~~~~~
+ CategoryInfo : ObjectNotFound: (choco:String) [], CommandNotFou
ndException
+ FullyQualifiedErrorId : CommandNotFoundException
The command 'cmd /S /C powershell -Command iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')); choco feature disable --name showDownloadProgress' returned a non-zero code: 1
解决方案
我前段时间遇到过这个问题。它摧毁了我一段时间,我无法弄清楚为什么我拥有的一个 Docker 映像构建良好,而下一个却没有。
我最终将其追溯到受限 TLS 的问题,即较新的 Windows docker 基础映像需要默认情况下未启用的 TLS1.2。您可能会在使用 Windows Server 核心基础容器时遇到这种情况。
Chocolatey 文档在其关于installing-with-restricted-tls的部分中提到了这种情况。
他们在撰写本文时的解决方法是在将它们放回原处之前使用 TLS 设置做一些小音乐椅 - 见下文
$securityProtocolSettingsOriginal = [System.Net.ServicePointManager]::SecurityProtocol
try {
# Set TLS 1.2 (3072), then TLS 1.1 (768), then TLS 1.0 (192), finally SSL 3.0 (48)
# Use integers because the enumeration values for TLS 1.2 and TLS 1.1 won't
# exist in .NET 4.0, even though they are addressable if .NET 4.5+ is
# installed (.NET 4.5 is an in-place upgrade).
[System.Net.ServicePointManager]::SecurityProtocol = 3072 -bor 768 -bor 192 -bor 48
} catch {
Write-Warning 'Unable to set PowerShell to use TLS 1.2 and TLS 1.1 due to old .NET Framework installed. If you see underlying connection closed or trust errors, you may need to do one or more of the following: (1) upgrade to .NET Framework 4.5 and PowerShell v3, (2) specify internal Chocolatey package location (set $env:chocolateyDownloadUrl prior to install or host the package internally), (3) use the Download + PowerShell method of install. See https://chocolatey.org/install for all install options.'
}
iex ((New-Object
System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
[System.Net.ServicePointManager]::SecurityProtocol = $securityProtocolSettingsOriginal
如果做不到这一点,请在不使用 choco 的情况下运行容器,docker run --name mycontainer -d [your container id]
然后使用交互式 shell using docker exec -it mycontainer powershell
,您将能够以交互方式运行 choco 安装以获取有关失败的更多信息。
推荐阅读
- java - 在jtable的所有行中导入mysql数据库的最后一行(Java Swing)
- html - 如何匹配 ` ` 标记之前的文本然后返回 ` ` 节点?
- cmd - 使用 sendmidi 将 MIDI 发送到 Microsoft GS Wavetable Synth
- tensorflow - 运行预训练的 CNN 时不可调用非类型对象
- high-availability - 我有两个并行的系统,每个系统全年都有 99.9% 的正常运行时间。总体正常运行时间是多少?
- jq - jq没有得到预期的输出
- acumatica - 我们可以根据 Acumatica 中的逻辑更改站点地图名称(屏幕名称)吗
- java - 用Java画圆
- css - 具有可滚动 div 的 CSS,占用 100% 可用高度,但不向正文添加滚动条
- visual-studio-code - 更漂亮的 vscode “r 不是函数”