2014-12-01 3 views
5

Я использую Docker с инжиром для сборки NodeJS dev-env.Nodemon не работает в среде Docker

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

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

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

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

ответ

1

первый вверх - 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/ 
+0

Спасибо за ваш ответ. В моем Dockerfile есть ошибка. На самом деле, я хочу: My nodejs env находится в контейнере Docker. Пока я меняю свой код в папке проекта на моей ОС хоста, контейнер будет обнаруживать измененный файл, а затем автоматически перезапускать server.js. Это моя ошибка, что я плохо описал свою проблему. Может ли Docker это сделать? – kerkerj

3

Это, как я это делаю:

Вам потребуется nodemon версии 1.3. 0-5 для этого (npm i -g [email protected])

.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" 

приложение/сервер. ЯШ:

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, чтобы начать работу.

Смежные вопросы