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/');
7 ответов
Сначала - 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/
Используйте специальный ключ для узла луны:
nodemon --legacy-watch
Вот как я это делаю:
Для этого вам понадобится версия 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
для начала.
Сервер автоматически перезапустится после сохранения, если вы поместите следующий код в файл package.json:
"nodemonConfig": {
"legacyWatch": true
}
Это также упоминается здесь .
Измените свой серверный скрипт nodemon файла package.json, как показано ниже. Дополнительная информация https://github.com/remy/nodemon#application-isnt-restarting.
"start": "nodemon -L index.js --игнорировать './tests'"
Для узла есть специальная опция, она работает в контейнерах.
node --watch-path=/app server.js
узел - версия 18.0.0+
Предположим, у вас есть проект, запущенный с использованием nodemon, и вы боретесь с его docker-izing.
Убедитесь, что конечные точки находятся внутри корневой папки проекта.
Шаг 1. Создайте образ докера
docker build -t docker-image-name .
Шаг 2. Запустите образ с подключением тома
docker run -it -p 9000:3000 -v $(pwd):/app docker-image-name