Решение
Я написал файл ввода, который запускает два потока в node.js
, поэтому Dockerfile
может быть очень ванильным.Теперь все, что нам нужно, это docker-compose
.
Dockerfile
FROM node:8
RUN npm install -g nodemon
docker-compose.yml
version: '3.5'
services:
app:
build: .
user: '1000'
working_dir: /opt/app
ports:
- 8080:8080
- 9229:9229
volumes:
- ./:/opt/app
command: 'node docker-entry.js'
docker-entry.js
/**
* @file docker-entry for development container
* @author Redsandro (https://www.windowsremix.com/)
*/
'use strict'
const { spawn } = require('child_process')
/*
* Install dependencies every time package.json changes
*/
spawn('nodemon -w package.json --exec "npm install"', {
stdio: 'inherit',
shell: true
})
/*
* Restart node when a source file changes, plus:
* Restart when `npm install` ran based on `package-lock.json` changing.
*/
spawn('nodemon --inspect -e js,json -i node_modules -i package.json index.js', {
stdio: 'inherit',
shell: true
})
.dockerignore
# Just ignore everything
**
Это работает, потому что package-lock.json
изменяется при добавлении или обновлении зависимостей.Так что npm 5 требуется.Не тестировался на изображениях других узлов.
Убедитесь, что в вашем рабочем каталоге нет node_modules
или package-lock.json
при первом запуске.Приложение внутреннего узла будет аварийно завершать работу при первом запуске (очевидно, оно не может найти зависимости), но оно будет перезапущено после установки зависимостей.
Введите docker-compose up -d && docker-compose logs -f
, чтобы увидеть результаты.Сделайте некоторые изменения в файлах и добавьте пакет to package.json
.
Каждый раз, когда вы запускаете контейнер, будет запускаться npm install
, что необязательно 9 из 10 раз, если вы не измените package.json
, покаконтейнер был остановлен.Это нормально, потому что приложение узла запускается параллельно, вам не нужно ждать, пока это завершится. Вы можете использовать контейнер немедленно.(Если, конечно, это не ваш первый запуск.)
Чтобы сделать: Я надеялся переместить node_modules
в какой-нибудь гостевой каталог (например, /tmp
), чтобы все эти данные былихранится на докере, а не на моем ноутбуке ssd.Что еще более важно, ваш хост и гость теперь используют одни и те же node_modules
. Если вы используете не-linux ОС и скомпилированные пакеты, у вас будет плохое время.Потому что он будет работать либо на хосте, либо на госте, но не на обоих.Кажется, я не могу указать другой установочный каталог для npm
, как я делал до без npm, записывая туда же package-lock.json
, , и этот файл необходим в локальном каталоге для работы этой установки.Я уверен, что с некоторыми умными связями это может работать, но я исчерпал время, которое я выделил для этого решения.Советы приветствуются.Не стесняйтесь добавлять дополнения и другие ответы.