gpt4 book ai didi

node.js - docker-compose 卷上的 Node 监视不注册删除事件

转载 作者:太空宇宙 更新时间:2023-11-03 22:06:46 27 4
gpt4 key购买 nike

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

在 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
});

当我在本地运行 Node 服务器时,观察器会正确拾取对所观察目录的更改。在这种情况下,chokidar 将这些报告为 addDirunlinkDir,它们对应于我运行的脚手架脚本,用于在目录(稍后通过express.static()提供)

标准输出:

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

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

两种情况中,卷目录都会正确镜像自身。例如。这些文件实际上已被删除或添加,我可以通过 shell 进入 docker 容器并运行 ls 来验证它们在主机上的存在。

有哪位 docker 天才能够以圣人的智慧来解释为什么会发生这种情况吗?

关键内容:

OS X 10.13.6

Docker 工具箱:

  • Docker 18.03.0-ce
  • docker-maching 0.14.0
  • docker-compose 1.20.1
  • 虚拟盒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"]

最佳答案

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

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

关于node.js - docker-compose 卷上的 Node 监视不注册删除事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52996052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com