Node.js 为什么不是';t使用Docker重新启动服务器/更新代码+;Nodejs?
我的docker文件非常简单:Node.js 为什么不是';t使用Docker重新启动服务器/更新代码+;Nodejs?,node.js,docker,Node.js,Docker,我的docker文件非常简单: FROM node:4-onbuild RUN npm install gulp -g; EXPOSE 8888 此图像将自动运行package.json中的start脚本,我将其设置为gulp 如果我在主机上运行gulp,并更改节点文件,它会自动重新启动服务器: var gulp = require('gulp'); var nodemon = require('gulp-nodemon'); gulp.task('default', function()
FROM node:4-onbuild
RUN npm install gulp -g;
EXPOSE 8888
此图像将自动运行package.json
中的start
脚本,我将其设置为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-p1234:4000-v$(pwd):/usr/src/app my image
转到
http://192.168.99.100:1234/
显示“你好,世界!”从我的server.js
文件。更新文件不会通过再次点击该URL来更新我看到的内容。如果我执行到容器中,我会看到文件已更新。由于容器通过同一个gulp命令启动了node,我不明白为什么node服务器不会重新启动并显示更新;这是因为您需要将nodemon设置为轮询文件系统的更改,如下所示:
在某些网络环境中(例如在安装的驱动器上运行nodemon reading的容器),您需要使用legacyWatch:true,它启用了Chokidar的轮询
通过CLI,使用--legacy watch或-L
较长的版本是这样的(有一个关键假设-您正在Mac或类似平台上使用docker):
在Mac或类似设备上,docker不以本机方式运行,而是在虚拟机内运行(通常通过docker机器在虚拟机中运行)。虚拟机通常不会传播文件系统inotify事件,这是大多数观察者在文件更改时重新启动或执行操作所依赖的。由于虚拟机不从主机传播事件,Docker从不接收事件。您的原始docker文件可能在本机linux机器上工作
关于这一点,有一个悬而未决的问题和更详细的讨论