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 容器挂载命名管道的主要内容,如果未能解决你的问题,请参考以下文章

从 Windows 上的 C# Service Fabric 应用程序连接到 docker_engine(命名管道)

Docker Compose - 在多个容器之间共享命名卷

docker数据卷容器

docker的overlay2目录

从 php 在命名管道上运行 shell 命令

Docker学习笔记Docker容器相关技术