1

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

我正在使用使用 的 babel-watch mkfifo,并且由于它在 docker 容器 (VM) 中运行,因此 mkfifo 无法在该网络共享目录中创建文件管道。[旁注:babel-watch 实际上确实可以在 docker 外部的 Windows 上使用 cygwin 运行,该 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?

有什么解决方法吗?

我尝试编辑 babel-watch 源以让 mkfifo 在其中创建一个文件,/var/app或者/var改为(它仍然在 docker 容器的领域内),虽然这种方式mkfifo确实有效,但 babel-watch 看不到文件更改。我想从根本上说,文件更改信息无法通过网络共享屏障/var/app/server(挂载点)传播到/var/app(docker内的真实目录)。

4

2 回答 2

1

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

如果您查看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 中的 docker 容器中使用 babel-watch。

于 2017-10-10T12:51:05.033 回答
1

mkfifo需要 Linux/OSX 环境,而/var/app/server从 Windows 挂载。所以它不起作用。所以你应该ADD或者COPY而不是挂载卷

于 2016-06-21T07:31:57.340 回答