将主机目录作为网络共享安装时,babel-watch无法在Windows主机上的docker容器中运行

时间:2016-06-21 06:55:02

标签: windows docker mkfifo

我在Windows上使用docker,我的src目录是mounted as a network share inside the docker container(而不是COPY)。因此,泊坞窗内的/var/app/server实际上是一个网络共享,其主机上的实际位置为C:\...project\server。 [旁注,我不熟悉docker如何在linux上工作,就像它仍然使用网络共享在Linux上安装一样?因为如果不是那么这可能只是windows问题]

我正在使用使用mkfifo的babel-watch,并且由于它在docker容器(VM)中运行,因此mkfifo无法在该网络共享目录中创建文件管道。 [旁注:babel-watch实际上可以在docker之外的windows上使用cygwin,它有一个mkfifo.exe工具]

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?

这有什么解决方法吗?

我尝试editing babel-watch source让mkfifo在/var/app/var中创建一个文件(它仍然在docker容器的范围内)并且这样{{1}实际上,babel-watch看不到文件更改。我想从根本上说,文件更改信息无法传播通过网络共享障碍 - mkfifo(挂载点)到/var/app/server(docker中的真实目录)。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我最近遇到了这个问题并进行了一些挖掘。

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

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中使用Docker容器中的babel-watch。