Nodemon在Docker环境中无法运行

19

我正在使用Docker和fig来构建NodeJS开发环境。

当我使用nodemon来监视server.js文件时,更改server.js不会重新启动服务器。

CMD ["nodemon", "/nodeapp/server.js"]

但是当我从nodemon改用supervisor之后,它就可以工作了!

CMD ["supervisor", "/nodeapp/server.js"]

有人知道问题出在哪里吗?

以下是更多信息:


我的 fig 文件夹结构:

app/server.js
    package.json
    node_modules/
fig.yml
Dockerfile

fig.yml:

nodejs:
  build: .
  ports:
    - "8080:8080"

Dockerfile:

RUN apt-get update --fix-missing
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# NVM
RUN curl -sL https://deb.nodesource.com/setup | sudo bash - && \
  apt-get install -y nodejs

VOLUME ./app:/nodeapp
WORKDIR /nodeapp

RUN rm /bin/sh && ln -s /bin/bash /bin/sh && \
  npm install -g nodemon mocha supervisor
CMD ["nodemon", "/nodeapp/server.js"]

Server.js:(来自NodeJS网站的示例代码)

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello 12\n');
}).listen(8080);

console.log('Server running at http://127.0.0.1:8080/');
6个回答

60

有一种特殊选项可以启用nodemon的传统观察模式:

nodemon --legacy-watch

4
这似乎是在 Docker 容器内让 nodemon 正常工作的推荐方法 https://github.com/remy/nodemon#application-isnt-restarting - Jonathan Holvey
2
-L 简写,但这对我也起作用。 - Jeremy Hamm
真的是一个非常简单而且棒极了的解决方案!赞! - Rafael Xavier
这是一个非常惊人的解决方案,在我的 Docker 容器 Node.js 服务器上真正起作用。 - Nay Oo Kyaw

6

以下是我的做法:

你需要使用nodemon版本1.3.0-5 (npm i -g nodemon@dev)

.dockerignore文件:

node_modules/*

Dockerfile:

FROM node:0.10

WORKDIR /nodeapp
ADD ./package.json /nodeapp/package.json
RUN npm install --production

ADD ./app /nodeapp/app

EXPOSE 8080

CMD ["node", ".", "--production"]

package.json:

{
  "name": "fig-nodemon",
  "version": "1.0.0",
  "description": "",
  "main": "./app/server.js",
  "scripts": {
    "nodemon": "fig up -d && fig run nodejs npm i --development && nodemon -x \"fig kill nodejs && fig build nodejs && fig start nodejs && fig logs nodejs\""
  },
  "author": "",
  "license": "MIT"
}

fig.yml:

nodejs:
  build: .
  command: node . --development
  volumes:
    - ./app:/nodeapp/app
  ports:
    - "8080:8080"

app/server.js:

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello 13\n');
}).listen(8080);

console.log('Server running at http://127.0.0.1:8080/');

然后我运行npm run nodemon来开始。


3

首先,VOLUME ./app:/nodeapp 并不会做你想要的事情 - 你正在镜像中创建一个名为 /app:/nodeapp 的目录 - 因此,在任何时候都不会将 server.js 文件添加到你的镜像中。

使用 docker run --rm -it yourimagename ls -la 进行测试。

将你的 Dockerfile 更改为:

FROM ubuntu

RUN apt-get update --fix-missing
RUN apt-get install -yq curl
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# NVM
RUN curl -sL https://deb.nodesource.com/setup | sudo bash - && \
  apt-get install -y nodejs

#VOLUME ./app:/nodeapp
ADD     app /nodeapp
WORKDIR /nodeapp

RUN rm /bin/sh && ln -s /bin/bash /bin/sh && \
  npm install -g nodemon mocha supervisor
CMD ["nodemon", "/nodeapp/server.js"]

我能帮你:

mini:nodaemon sven$ docker run --rm -it -p 8080:8080 nodaemon     
2 Dec 02:27:52 - [nodemon] v1.2.1
2 Dec 02:27:52 - [nodemon] to restart at any time, enter `rs`
2 Dec 02:27:52 - [nodemon] watching: *.*
2 Dec 02:27:52 - [nodemon] starting `node /nodeapp/server.js`
Server running at http://127.0.0.1:8080/

2
谢谢您的回复。我的Dockerfile有误。 实际上,我想要的是: 我的Node.js环境在Docker容器中。 当我在主机操作系统的项目文件夹中更改代码时,容器将检测到更改的文件并自动重新启动server.js。 是我的疏忽没有清楚地描述我的问题。 Docker可以做到吗? - kerkerj

2
如果您将以下代码放入package.json文件中,则保存后服务器将自动重新启动:
"nodemonConfig": {
    "legacyWatch": true
}

这也在这里提到了。


1

0
有一个特殊的选项适用于节点,在容器中起作用。
node --watch-path=/app server.js

node -version 18.0.0+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接