我在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安装的。 所以它不起作用。 所以你应该ADD
或COPY
而不是挂载量
我最近遇到这个问题,做了一点挖掘。
如果你看看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。