docker-compose卷上的节点监视未注册删除事件

时间:2018-10-25 18:39:12

标签: node.js docker docker-compose watch chokidar

我有一个在Docker容器中运行的简单Node.js HTTP服务器。基本结构文件夹之一使用volume中的docker-compose.yml来镜像主机和容器目录。

在Node服务器中,我设置了一个监视程序,以使用NPM软件包chokidar 跟踪卷目录中的更改(尽管我已经尝试了多个其他具有相同结果的监视程序)

const watcher = require("chokidar");

watcher
.watch("./app/experiments", { depth: 0, ignoreInitial: true })
.on("all", (event, path) => {
    console.log(event);
    // ... DO SOME EXPRESS AND WEBPACK STUFF 
});

当我在本地运行节点服务器时,观察者正确地选择了对观察目录的更改。在这种情况下,chokidar将它们报告为addDirunlinkDir,它们与我运行的脚手架脚本相对应,该脚本用于在目录中添加或删除新文件夹(稍后提供)通过express.static()

标准输出:

> addDir
> EXPERIMENT ADDED!
> ...
> unlinkDir
> EXPERIMENT DELETED!

但是,当我将应用程序移植到Docker容器中时,行为以一种非常奇怪的方式改变。在卷目录中创建新文件夹时,我继续收到addDir事件,但我不再收到unlinkDir(删除)事件!。请注意,仅当我在主机上的卷目录中添加/删除文件时,才会发生这种情况。如果我在docker容器内的该目录中添加/删除文件,我的观察者会正确报告所有这些事件。

无论在哪种情况下,已卷目录均会正确镜像其自身。例如。文件实际上已经被删除或添加了,我可以验证它们是否存在于主机上,并通过脱壳进入docker容器并运行ls

任何码头工人天才都有明智的智慧,为什么会这样?

键填充:

OS X 10.13.6

Docker工具箱:

  • Docker 18.03.0-ce
  • docker-maching 0.14.0
  • docker-compose 1.20.1
  • virtualbox 5.2.18r124319

Dockerfile:

FROM node:8.12.0

WORKDIR /usr/dd-labs

COPY package*.json ./
RUN npm install

COPY app/ ./app
COPY server.js ./
COPY webpack/ ./webpack

EXPOSE 8080

Docker-compose.yml:

version: "2"
services:
  app:
    image: #someImageName
    build: .
    ports:
      - "8080:8080"
    labels:
      io.rancher.container.pull_image: always
    environment:
      VIRTUAL_HOST: labs.docker
    volumes:
      - ./app:/usr/dd-labs/app
    command: [sh, -c, "npm run start:dev"]

1 个答案:

答案 0 :(得分:0)

您可能正在使用Docker for Windows,该操作系统具有very well known lack of support,用于文件系统事件从主机传播到容器。

一种解决方法是在开发环境中使用轮询。使用chokidar,您需要usePolling: true选项。