Windows 2016:Docker容器错误

8

我在Windows Server 2016上使用Docker,使用“microsoft/windowsservercore:latest”镜像创建了一个容器。在此镜像上,我安装了“Print-Server”角色,但是当我尝试调用“Get-Printer” cmdlet时,会出现与打印池服务相关的错误。以下是重现问题所使用的命令:

docker run -d --name testspoolererror1 microsoft/windowsservercore:latest ping -t localhost
docker exec -it testspoolererror1 powershell
Install-WindowsFeature Print-Server
Set-Service spooler -StartupType Automatic
Start-Service spooler
Get-Service spooler
Get-Printer

当我收到这个错误时:

Get-Printer:无法访问打印池服务。请确保打印池服务正在运行。 在第1行第1个字符处 + Get-Printer + ~~~~~~~~~~~ + CategoryInfo : NotSpecified: (MSFT_Printer:ROOT/StandardCimv2/MSFT_Printer) [Get-Printer], CimException + FullyQualifiedErrorId : HRESULT 0x800706ba,Get-Printer 在事件查看器中,我发现了以下错误: 打印池服务意外终止。它已经这样做了2次。

有人可以帮助我解决这个问题吗?


我遇到了同样的问题。运行Get-Service spooler显示打印队列服务已启动,但在运行Get-Printer后崩溃。 Get-WinEvent指示打印队列服务已崩溃,并额外显示:打印队列失败加载插件模块WSDMon.dll,错误代码为0x7E。请查看事件用户数据以获取上下文信息。 - fons
4个回答

2
因为Windows容器与主机共享相同的内核,所以您不能同时运行两个打印池。因此,请停止并禁用主机上的打印池,然后您就可以在该服务器上的一个容器中使用打印池了。
以下是已修复的一组命令:
Stop-Service spooler Set-Service spooler -StartupType Disabled
docker run -d --name testspoolererror1 microsoft/windowsservercore:latest ping -t localhost docker exec -it testspoolererror1 powershell Install-WindowsFeature Print-Server Set-Service spooler -StartupType Automatic Start-Service spooler Get-Service spooler Get-Printer

1
我很抱歉听到您遇到了这个问题,我会尽力帮助您解决它 :)
为了全面起见,我自己尝试了一下,运行了以下命令:
docker run -it microsoft/windowsservercore:latest powershell

(现在正在容器内部运行 Powershell)

Install-WindowsFeature Print-Server
Set-Service spooler -StartupType Automatic
Start-Service spooler
Get-Service spooler
Get-Printer

我能在我的系统上运行这些命令,没有出现错误。所以这是一个好的开始。

现在,从你的错误信息来看,似乎打印池服务甚至没有启动。当你运行Get-Service spooler时,你看到了什么?你能否像我列出的那样在你的系统上运行这些命令,然后向我报告你的结果?

另外,为了澄清一下,当你从容器中ping本地主机时,你想要做什么?你想ping你的容器主机吗?

顺便说一下,如果你正在寻找有关Windows容器网络如何工作的背景信息,这里是一个很好的起点:https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/container-networking

--Kallie B. (Microsoft Networking团队的程序经理)


我已经使用您的命令进行了测试,但出现了错误:Get-Printer: 打印池服务无法访问。在“Get-Printer”调用之前和之后,请确保打印池服务正在运行。我已在更新的Windows 2016 DataCenter上进行了测试,使用了docker 1.12和docker 1.14-dev,结果相同。 - bdn02
我遇到了与Scott相同的问题。Get-Service spooler 显示打印池已启动,但在运行 Get-Printer 后崩溃。Get-WinEvent 表明打印池已崩溃,并且还显示:打印池无法加载插件模块 WSDMon.dll,错误代码为0x7E。请参考事件用户数据以获取上下文信息。 - fons
@Kallie-Microsoft 有什么建议吗? - fons

-1
Kallie似乎能够成功运行上述步骤的原因可能是它的托管方式不同。我在一个运行Server 2016的Docker容器中尝试了上述步骤,但遇到了相同的错误。当我在Windows 10上通过Docker尝试时,我可以成功启动spooler并运行上述命令,但我无法成功安装任何驱动程序,这使得它实际上没有用处。Pnputil在尝试安装任何.inf文件时只会抛出奇怪的“无数据”错误。
我猜测它在Windows 10上能够正常工作,是因为它使用了超级-v仿真,而不是在Server 2016上托管Server 2016 Core时使用的本机容器。我还注意到,当在Server 2016上创建容器时,驱动程序是从基本计算机继承而来的,但在Windows 10上不是。我认为Docker专家已经很好地理解了这种行为,但看起来继承的驱动程序可能会导致崩溃。不过,我也不是Windows专家。
无论如何,这似乎是微软需要调查和解决的问题。

-3
  • Docker默认运行的网络与宿主机不是同一个网络。

  • 在容器内部从本地主机pinglocalhost并不会产生你想象中的效果。

  • 首先要学习Docker的网络知识。


不认为问题与网络有关,因为所有命令都是在容器内执行的。此外,“ping”命令只会导致容器继续运行。我觉得这个问题非常合理。 - Gene

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