将主机目录作为networking共享挂载时,babel-watch无法在Windows主机上的Docker容器上工作

我在Windows上使用docker,我的src目录作为networking共享装入docker容器 (而不是COPY)。 所以docker里面的/var/app/server实际上是一个networking共享,其实际位置在我的主机上是C:\...project\server 。 [旁注,我不熟悉docker在linux上的工作方式,就像它仍然使用networking共享在Linux上挂载一样? 因为如果不是那么这可能只是Windows问题]

我使用的是使用mkfifo babel-watch,因为它在docker容器(VM)内运行,mkfifo无法在该networking共享目录中创build文件pipe道。 [旁注:babel-watch实际上可以在docker以外的窗口上运行,它带有一个mkfifo.exe实用程序的cygwin]

 server_1 | mkfifo: cannot create fifo `/var/app/server/116521-16-pz2v9g.ma216skyb9': Operation not permitted server_1 | Unable to create named pipe with mkfifo. Are you on linux/OSX? 

有没有解决方法?

我试图编辑babel-watch源文件,让mkfifo在/var/app/var创build一个文件(它仍然在docker容器的领域内),而这种方式mkfifo实际上工作,文件的变化不是由babel观看。 我猜根本上文件更改信息是无法传播通过networking共享障碍 – /var/app/server (挂载点) /var/app (泊坞窗内的实际目录)。

mkfifo需要Linux / OSX环境,而/var/app/server是从Windows安装的。 所以它不起作用。 所以你应该ADDCOPY而不是挂载量

我最近遇到这个问题,做了一点挖掘。

如果你看看babel-watch的源代码 (在撰写本文时),你会发现它试图在操作系统的临时目录中创建命名管道。

 function generateTempFilename() { const now = new Date(); return path.join(os.tmpdir(), [ now.getYear(), now.getMonth(), now.getDate(), '-', process.pid, '-', (Math.random() * 0x100000000 + 1).toString(36), ].join('')); } 

在我们的docker容器中, $TMPDIR没有设置,导致在当前工作目录中创建了命名管道。 设置它改变这个:

 TEMP_DIR=/tmp babel-watch index.js 

这意味着mkfifo调用不是针对Windows文件系统。 但是这并没有解决在Windows文件系统上未被选中的问题。 要检测更改,可以使用轮询标志--use-polling 。 这使得命令:

 TEMP_DIR=/tmp babel-watch --use-polling index.js 

一起使用这两者允许我们在Docker for Windows中的泊坞窗容器中使用babel-watch。