为什么我的服务器不能使用Docker + Nodejs重新启动/代码更新?

时间:2016-03-11 19:53:33

标签: node.js docker

我的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命令启动节点,我不明白为什么节点服务器不会重新启动并显示更新。

1 个答案:

答案 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的详细讨论。