繁体   English   中英

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

[英]babel-watch doesn't work from docker container on windows host when mounting a host directory as a network share

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

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

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实际上有效,但文件更改不会通天塔看。 我想从根本上说文件更改信息无法通过网络共享屏障- /var/app/server (挂载点)传播到/var/app (泊坞窗内的真实目录)。

mkfifo需要Linux / OSX环境,而/var/app/server是从Windows挂载的。 因此它不起作用。 因此,您应该ADDCOPY而不是挂载卷

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

如果查看babel-watch源文件 (在撰写本文时),您会看到它尝试在OS的临时目录中创建命名管道。

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

将这两者结合使用,使我们能够从Windows版Docker中的Docker容器中使用babel-watch。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM