docker - 安装 Docker Windows Server 2019:术语“docker”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称
问题描述
尝试在 Windows Server 2019 上以进程隔离方式安装 Docker 并按照以下步骤操作。(我不能在此服务器上使用 Hyper-V)在管理员模式下运行 PowerShell 时。
但是我得到了错误
Get-PackageProvider:找不到与参数名称“ListAvailableget-packagesource”匹配的参数
我也试过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 得到任何反馈,也没有错误,所以我认为这很好。
但是,当我在这里检查并运行时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
变量的路径。
我仍然得到同样的错误
术语“docker”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。
更新 2
根据@Peter Wishart 的回答,我检查了我的PATH
系统变量,但在那里可以看到 Docker(见下面的屏幕截图),正如 Peter 也提到的,因为我可以docker --version
通过命令提示符(而不是 PowerShell)运行安装成功完成。
更新 3
我签($env:path).Split(";")
入了 PowerShell 并且 Docker 路径在那里:
如何安装 Docker?
解决方案
我使用了一个脚本来安装容器功能并卸载 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 路径移动到更靠近路径开头的位置,您应该能够获得永久修复。
推荐阅读
- ruby-on-rails - 为什么 if __FILE__ == $0 在带有 Rails 5.2 的 Heroku 上不起作用?
- django - django左外连接过滤不匹配记录
- python - 当涉及新行时,如何从文本中提取模式?
- vb.net - 覆盖 Sub 以检查值是否为数字
- hyperledger-fabric - 错误bash:令牌:发出令牌时找不到命令
- reactjs - React Hooks:有没有办法根据另一个状态值计算状态值
- terraform-provider-aws - 当索引>值列表时,元素()函数是否有可用的异常处理?
- react-native - 在应用程序运行时存储数据 [React Native]
- javascript - 如何修复 Django 中的“object() 不带参数”错误
- forms - 如果可能,是否有选项或其他方法可以更改 NetSuite 交易表单中“子列表字段”列的显示类型?