我在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中的真实目录)。
答案 0 :(得分:1)
mkfifo
需要Linux / OSX环境,而/var/app/server
是从Windows安装的。所以它不起作用。所以你应该ADD
或COPY
而不是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。