Docker Windows 容器挂载命名管道
Posted
技术标签:
【中文标题】Docker Windows 容器挂载命名管道【英文标题】:Docker Windows container mounting named pipe 【发布时间】:2017-12-22 09:22:47 【问题描述】:我正在尝试在容器中使用 Jenkins 并挂载命名管道来控制主机上的 docker 引擎。根据this 博客文章,为此安装命名管道就足够了。但是,当我使用该挂载运行容器时,容器上没有打开命名管道,因此 docker 客户端不起作用。
我应该在 Dockerfile 中手动打开命名管道吗?如果有,怎么做?
这是一个没有 Jenkins 的最小复制(我也尝试将 docker 插件安装到 Jenkins 并通过巧克力将 docker 客户端安装到容器。):
Docker version 17.09.1-ce, build 19e2cf6
Windows version 1709, Build 16299.125
Dockerfile:
# escape=`
FROM microsoft/windowsservercore
SHELL ["powershell"]
ENTRYPOINT [System.IO.Directory]::GetFiles("\\.\\pipe\\");
构建和运行的命令:
docker build -t namedpipetest .
docker run -v \\.\pipe\docker_engine:\\.\pipe\docker_engine namedpipetest
输出是:
\\.\\pipe\\InitShutdown
\\.\\pipe\\lsass
\\.\\pipe\\ntsvcs
\\.\\pipe\\scerpc
\\.\\pipe\\Winsock2\CatalogChangeListener-454-0
\\.\\pipe\\epmapper
\\.\\pipe\\Winsock2\CatalogChangeListener-124-0
\\.\\pipe\\LSM_API_service
\\.\\pipe\\eventlog
\\.\\pipe\\Winsock2\CatalogChangeListener-4b8-0
\\.\\pipe\\wkssvc
\\.\\pipe\\TermSrv_API_service
\\.\\pipe\\Ctx_WinStation_API_service
\\.\\pipe\\winreg
\\.\\pipe\\cexec-76
\\.\\pipe\\cexec-77
\\.\\pipe\\Winsock2\CatalogChangeListener-4f4-0
\\.\\pipe\\SessEnvPublicRpc
\\.\\pipe\\Winsock2\CatalogChangeListener-278-0
\\.\\pipe\\PSHost.131584061845916516.1868.DefaultAppDomain.powershell
输出:
docker inspect -f ' .Mounts ' 3edad32c9f81
[npipe \\.\pipe\docker_engine \\.\pipe\docker_engine true ]
【问题讨论】:
【参考方案1】:我可以重现同样的问题 - 在我进行调查时,我发现我需要指定该标签以匹配我的 Windows 版本。例如,由于我使用的是1803
构建,我需要为microsoft/windowsservercore
使用1803
标签。之后,我能够看到管道安装成功。
所以我真正改变的只是
FROM microsoft/windowsservercore
到
FROM microsoft/windowsservercore:1803
在您引用的博客文章中,他们确实特意指定了 Windows 1709,但似乎没有提到这个问题。所以也许你只是缺少一个标签?
【讨论】:
看来问题在 Windows 1803 中已解决。但是,我仍然无法连接主机上的 docker 守护进程。这可能是 Hyper-V 隔离的问题。请参阅this 问题。 我遇到了同样的问题,我认为我必须使用--isolation hyperv
- 但我意识到这只是为了绕过不同的 Windows 版本的图像因不同的原因而失败。在我开始使用正确的标签后,我能够停止使用 hyperv 隔离并能够安装命名管道 correclty以上是关于Docker Windows 容器挂载命名管道的主要内容,如果未能解决你的问题,请参考以下文章