在Windows Server 2019上安装Docker:术语“docker”不被识别为命令、函数、脚本文件或可操作程序。

3
尝试在 Windows Server 2019 上使用进程隔离安装 Docker,并按照 这些步骤 进行操作(无法在此服务器上使用 Hyper-V),在以管理员模式运行 PowerShell 时,遇到以下错误:

Get-PackageProvider:找不到与参数名称 'ListAvailableget-packagesource' 匹配的参数。 enter image description here

我还尝试过 Install-Package -Name docker -ProviderName DockerMsftProvider,然后出现以下错误:
Install-Package : Unable to find package providers (DockerMsftProvider).
At line:1 char:1
+ Install-Package -Name docker -ProviderName DockerMsftProvider
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], E
   xception
    + FullyQualifiedErrorId : UnknownProviders,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

Install-Package : Unable to find package providers (DockerMsftProvider).
At line:3 char:1
+ Install-Package -Name docker -ProviderName DockerMsftProvider
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], E
   xception
    + FullyQualifiedErrorId : UnknownProviders,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

更新1

我必须将PowerShell 执行策略 设置为无限制,如下所示(完成后我将把它重新设置为受限 Set-ExecutionPolicy -ExecutionPolicy Restricted):

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

我还必须暂时禁用Windows Defender中的一些防病毒/恶意软件保护。对我来说,反恶意软件已经被禁用了,所以我还必须禁用实时病毒保护。

然后我可以运行

Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

现在通过 Get-PackageProvider -ListAvailable 我可以看到已安装了 DockerMsftProvider

Name                     Version          DynamicOptions
----                     -------          --------------
DockerMsftProvider       1.0.0.8          Update
msi                      3.0.0.0          AdditionalArguments
msu                      3.0.0.0
NuGet                    2.8.5.208        Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag...
PowerShellGet            1.0.0.1          PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, ...
Programs                 3.0.0.0          IncludeWindowsInstaller, IncludeSystemComponent

我运行了Install-Package -Name docker -ProviderName DockerMsftProvider,并输入了Y

然后我运行Get-Package -Name Docker -ProviderName DockerMsftProvider,得到:

Name                           Version          Source                           ProviderName
----                           -------          ------                           ------------
docker                         20.10.0          DockerDefault                    DockerMsftProvider

当我运行Install-Package -Name docker -ProviderName DockerMsftProvider时,PowerShell没有任何反馈,也没有错误,所以我认为它很好。
然而,当我checked here并运行docker run --isolation=process mcr.microsoft.com/windows/nanoserver:1809 cmd.exe /c ping 127.0.0.1 -t时,
我收到了错误提示。
docker : The term 'docker' 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:1
+ docker run --isolation=process mcr.microsoft.com/windows/nanoserver:1 ...
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (docker:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

过去我曾尝试安装 Docker Desktop,但由于我的 VPS 不支持 Hyper-V,因此我将其卸载。我不确定这是否仍然与那次安装有关,但我将路径 C:\Program Files\Docker 添加到环境变量的 PATH 中。

enter image description here

我仍然遇到相同的错误

“docker”一词不被识别为命令、函数、脚本文件或可操作程序的名称。

更新2

根据@Peter Wishart的答案,我检查了我的PATH系统变量,但是Docker可以在那里看到(如下面的屏幕截图所示),正如Peter所提到的那样,由于我可以通过命令提示符(而不是PowerShell)运行docker --version,因此安装已成功完成。

enter image description here

更新3
我在PowerShell中检查了($env:path).Split(";"),Docker路径就在那里: enter image description here

我该如何安装Docker?

1个回答

3
我使用一个脚本安装容器功能并卸载Windows Defender(注意:这可能对您的环境安全性有影响):
$rebootNeeded = $false
if (-not (Get-WindowsFeature Containers).Installed) {
  $rebootNeeded = $rebootNeeded -or (Install-WindowsFeature -Name Containers).RestartNeeded
}

if ((Get-WindowsFeature Windows-Defender).Installed) {
  $rebootNeeded = $rebootNeeded -or (Uninstall-WindowsFeature Windows-Defender).RestartNeeded
}

if ($rebootNeeded) { throw "Reboot then rerun to complete docker installation" }

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider -Force
Start-Service docker  
docker --version

如果没有其他办法可用的话,我建议您重置机器......

我认为您的第一个问题是在Get-PackageProvider步骤中出现了复制/粘贴错误。

您列出的文件是最新版DockerEE的正确文件。

如果您直接从那里运行docker,例如:&"C:\Program Files\Docker\docker.exe" --version,但它无法正常工作,则存在其他环境问题,除了路径以外 - 请尝试重新安装Docker。

如果您重新启动Powershell并运行($env:path).Split(";"),唯一的Docker条目应该是C:\Program Files\Docker - 也许有一些来自Docker Desktop的残留物在干扰?

[编辑]

看起来系统路径在某种微妙的方式上已经损坏了(尽管Docker路径存在且正确)。

我认为,如果您仔细检查路径配置和/或将Docker路径移至路径的开头,您就可以获得永久性解决方案。


谢谢!我测试了环境设置:如果我运行($env:path).Split(";"),我只能看到路径引用到"Docker"的唯一路径是"C:\Program Files\Docker"。我使用 cmd,导航到文件夹 "C:\Program Files\Docker" 并运行 docker --version,我看到"Docker版本20.10.0,构建6ee42dc"。我不确定是否仍然需要尝试您的脚本,因为环境似乎已正确设置?如果不是,还有什么其他方法我可以尝试吗? - Adam
1
脚本在我的新 Server 2019 实例上运行正常。 看到正确的 docker --version 表示 docker 已经安装好了。 我可以通过运行 $env:path=":C:\Program Files\Docker" 然后尝试运行 docker(注意:开头有无效字符)来重现您遇到的错误。 如果我然后运行 $env:path="C:\Program Files\Docker",PowerShell 可以找到 docker,所以我认为问题出在路径变量上。 - Peter Wishart
啊,好的。既然安装成功了,那我就不需要尝试那个脚本了。请看我的更新2,我确认了路径变量。 - Adam
不清楚您是否尝试了我上面建议的$env:path设置,我认为这应该显示出问题所在是PowerShell中的“有效路径”。 - Peter Wishart
我根据您的建议在PowerShell中添加了更新3以获取路径,这似乎没问题。但我没有看到您在回答中设置PowerShell的路径? - Adam
显示剩余2条评论

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