我的docker文件非常简单:
FROM node:4-onbuild
RUN npm install gulp -g;
EXPOSE 8888
此图片会自动运行start
中的package.json
脚本,我将其设置为gulp
。
如果我在主机上运行gulp
,并对节点文件进行更改,它会自动重启服务器:
var gulp = require('gulp');
var nodemon = require('gulp-nodemon');
gulp.task('default', function() {
nodemon({
script: 'server.js', // starts up server on port 4000
env: { 'NODE_ENV': 'development' }
})
});
确定一切正常我运行:docker run -d -p 1234:4000 -v $(pwd):/usr/src/app my-image
前往http://192.168.99.100:1234/
显示'Hello World!'来自我的server.js
文件。更新文件不会通过再次点击该URL来更新我看到的内容。如果我执行到容器,我看到文件已更新。由于容器通过相同的gulp命令启动节点,我不明白为什么节点服务器不会重新启动并显示更新。
答案 0 :(得分:0)
TL; DR是您需要设置nodemon以轮询文件系统以进行更改,如下所示:https://github.com/remy/nodemon#application-isnt-restarting
在某些网络环境中(例如运行nodemon读取已安装驱动器的容器),您需要使用legacyWatch:true来启用Chokidar的轮询。
通过CLI,使用--legacy-watch或-L
更长的版本是这个(有一个关键假设 - 你在Mac上使用docker或类似的):
在Mac或类似设备上,docker不会本机运行,而是在虚拟机内部运行(通常是通过docker-machine运行的虚拟机)。虚拟机通常不传播文件系统inotify事件,这是大多数观察者在文件更改时重新启动或执行操作所依赖的事件。由于虚拟机不会从主机传播事件,因此Docker永远不会接收事件。原始的docker文件可能在本机linux机器上工作。
有一个未解决的问题以及对此here的详细讨论。