Nodemon не работает в среде Docker

Я использую Docker с fig для сборки NodeJS dev-env.

Пока я использую nodemon для просмотра server.js, изменение server.js не приведет к перезапуску сервера.

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

Но пока я перешел с nodemon на супервизора, это сработало!

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

Кто-нибудь знает, где проблема?

Дополнительная информация ниже:


Моя фиговая структура папок:

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/');

person kerkerj    schedule 01.12.2014    source источник


Ответы (4)


во-первых - 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/
person SvenDowideit    schedule 02.12.2014
comment
Спасибо за ваш ответ. В моем Dockerfile есть ошибка. Собственно, я хочу: мой nodejs env находится в контейнере Docker. Пока я изменяю свой код в папке проекта на своей операционной системе, контейнер обнаружит измененный файл и затем автоматически перезапустит server.js. Это моя ошибка, что я плохо описал свою проблему. Может ли Докер это сделать? - person kerkerj; 04.12.2014

Существует специальная опция для включения устаревшего режима наблюдения nodemon:

nodemon --legacy-watch
person haiflive    schedule 14.12.2018
comment
Очевидно, это рекомендуемый способ заставить nodemon работать внутри контейнера Docker github.com/remy/ nodemon # application-isnt-restarting - person Jonathan Holvey; 30.07.2020
comment
-L сокращение, но это тоже сработало для меня - person Jeremy Hamm; 04.03.2021

Вот как я это делаю:

Для этого вам понадобится 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"

приложение / 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, чтобы начать.

person Jan    schedule 09.12.2014

Предположим, у вас есть проект, запущенный с использованием nodemon, и вы боретесь с его докеризацией.

Убедитесь, что конечные точки находятся внутри корневой папки проекта.

Шаг 1. Создайте образ докеры

docker build -t docker-image-name .

Шаг 2. Запустите образ с подключением тома

docker run -it -p 9000:3000 -v $(pwd):/app docker-image-name

person Nishant Shah    schedule 29.10.2019