我有一个在Docker容器中运行的简单Node.js HTTP服务器。基本的结构文件夹之一使用ojit_code中的volume
镜像主机和容器目录。
在Node服务器中,我使用NPM包docker-compose.yml
设置了一个监视程序来跟踪卷目录中的更改(尽管我已经尝试了多个其他具有相同结果的监视程序)。
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
将它们报告为chokidar
或addDir
,它们与我运行以在目录中添加或删除新文件夹的脚手架脚本相对应(稍后通过unlinkDir
提供)。STDOUT:
> addDir
> EXPERIMENT ADDED!
> ...
> unlinkDir
> EXPERIMENT DELETED!
但是,当我将应用程序移植到Docker容器中时,行为会以一种非常奇怪的方式改变。在卷目录中创建新文件夹时,我继续收到
express.static()
事件,但不再接收addDir
(删除)事件! 。请注意,仅当我在主机上的卷目录中添加/删除文件时,才会发生这种情况。如果我在docker容器内的该目录中添加/删除文件,我的观察者会正确报告所有这些事件。无论哪种情况,卷目录都可以正确地进行自身镜像。例如。这些文件实际上已被删除或添加,我可以验证它们是否存在于主机上,并通过脱壳进入docker容器并运行
unlinkDir
。那里的任何docker天才都具有明智的智慧,为什么会这样?
密钥文件:
OS X 10.13.6
Docker工具箱:
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"]
最佳答案
您可能正在使用Docker for Windows,它具有very well known lack of support,用于文件系统事件从主机传播到容器。
解决方法是在开发环境中使用轮询。使用chokidar,您需要usePolling: true
选项。