2015-03-11 2 views

ответ

14

Вы можете сделать, как указано в билете: https://github.com/Unitech/pm2/issues/13

Хотя, если вы передаете среду вы можете рассмотреть возможность привлечения переменных среды. С помощью этого вы создаете переменную, к которой можно получить доступ любым процессом в этой среде с помощью process.env.*.

Так у вас есть файл конфигурации config.json:

{ 
    "dev": { 
     "db": { 
      "hosts":["localhost"], 
      "database": "api" 
     }, 
     "redis": { 
      "hosts": ["localhost"] 
     } 
    }, 
    "staging": { 
     "db": { 
      "hosts":["1.1.1.1"], 
      "database": "api" 
     }, 
     "redis": { 
      "hosts": ["2.2.2.2"] 
     } 
    }, 
    "production": { 
     "db": { 
      "hosts":["1.1.1.1", "1.1.1.2", "1.1.1.3"], 
      "database": "api" 
     }, 
     "redis": { 
      "hosts": ["2.2.2.2", "2.2.2.3"] 
     } 
    } 
} 

Затем импортировать конфигурации:

var config=require('./config.json')[process.env.NODE_ENV || 'dev']; 

db.connect(config.db.hosts, config.db.database); 

Тогда вы бы установить переменную в вашей среде с помощью оболочки:

export NODE_ENV=staging 
pm2 start app.js 

Переменная среды будет продолжаться до тех пор, пока ваша сессия. Поэтому вам нужно будет установить его в файле ~/.bashrc для этого пользователя, чтобы переменная сохранялась. Это установит переменную на каждый сеанс.

PM2 имеет deploy system, который позволяет вам устанавливать переменную окружения каждый раз, прежде чем ваше приложение будет демоннизировано. Так как демоны в системах POSIX обычно принимают параметры, поскольку эти параметры не теряются в процессе. Учитывая ваши обстоятельства, это может не иметь большого значения, но это хорошая практика.

Кроме того, вы должны рассмотреть возможность остановки/запуска локально и перезапустить (если в режиме кластера), когда это возможно, чтобы предотвратить простои в процессе производства.

+0

Я установил это с помощью AWS Code Deploy и моего приложения Node.JS, и он отлично работает. Я использую порт 4040 локально и 80 на AWS. Это элегантное решение для правильной настройки портов. Спасибо! – BuffMcBigHuge

54

Если вы хотите передать аргументы узла из CLI затем

pm2 start myServer.js --node-args="--production --port=1337" 

.

Edited

вы можете добавить любые аргументы после -x --

pm2 start app.js -x -- --prod 

Sails документы для deploymemt.

+1

Это хорошо. Но, передавая его Докеру, это не работает. Может кто-нибудь, PLS помочь мне. , ENTRYPOINT ["pm2"] CMD ["start", "msg/myServer.js", "--node-args = '- firstarg'", "- no-daemon"] –

+0

@RajRajen: re using docker Я чувствую, что работает PM2 - это не ваш лучший вариант. Или пусть Docker контролирует ваше приложение и использует его политику перезагрузки, чтобы поддерживать ваше приложение в живом виде, или использовать что-то вроде супервизора, чтобы ваш контейнер не перезапускался каждый раз, когда ваше приложение опускается. Когда вы запускаете PM2 в докере, вы теряете много полезных функций PM2, и все, что он действительно делает, это поддерживать ваше приложение в живых. В этот момент использование навсегда или система init будет делать то же самое, и, вероятно, будет проще. Supervisord чрезвычайно распространен для контейнеров докеров, на которых работает более 1 услуги на контейнер. – tsturzl

+2

Для докеров вы можете использовать специальную команду PM2, pm2-docker. Дополнительная информация здесь: http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/ – Unitech

0

Ну есть 2 способа вы можете сделать, чтобы передать параметры из пм2 в nodejs в CLI:

  • PM2 начать app.js - DEV --port = 1234 (обратите внимание, что дополнительное пространство между - и dev)
  • после полудня2 старт приложение.JS --node-Args = "DEV --port = 1234"

Оба пути, вы найдете существуют эти значения в process.argv ([ 'разработчика', '- порт = 1234'])

0

Из pm2 Docs

//Inject what is declared in env_production 
$ pm2 start app.js --env production 

//Inject what is declared in env_staging 
$ pm2 restart app.js --env staging 
3

можно определить аргументы процесса.

Вы можете определить новый процесс в ecosystem.config.js с args ключа, например, так:

{ 
    name   : 'my-service', 
    script   : './src/service.js', 
    args   : 'firstArg secondArg', 
}, 
{ 
    name   : 'my-service-alternate', 
    script   : './src/service.js', 
    args   : 'altFirstArg altSecondArg', 
} 

Здесь два процесса используют один и тот же файл (service.js), но передавать различные аргументы к нему.

Обратите внимание, что эти аргументы обрабатываются в пределах service.js. В моем случае я только что использовал process.argv[2], чтобы получить первый аргумент и так далее.

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