#node.js #docker #pm2
#node.js #docker #pm2
Вопрос:
Я пытаюсь перезапустить NODE.js веб-приложение само по себе, когда запрос GET имеет определенный параметр запроса, например …?foo=12 . Затем я передаю это значение foo новому экземпляру через NODE.JE параметр процесса. Я получил это, работая без внешних зависимостей (pm2, навсегда), используя следующий код:
app.get('*', (req:IncomingMessage, res:ServerResponse, next:()=>void) => {
process.on('exit', () => {
const cmd:string = process.argv.shift() ?? '';
const fooValue:string = getFooParameterValue();
let argv = process.argv;
if(fooValue){
argv = [...process.argv, '-foo', fooValue];
}
const argv : string[] = [...process.argv, '-foo', fooValue];
childProcess.spawn(cmd, argv, {
cwd: process.cwd(),
detached: true,
stdio: 'inherit',
});
});
process.exit();
});
Локально все работает отлично, но когда я создаю образ и запускаю его в docker, он не будет работать. Я думаю, что контейнер docker подключен к процессу 1-го экземпляра, и когда я выхожу из этого 1-го экземпляра, контейнер также останавливается вместо запуска 2-го экземпляра. Моя цель здесь — иметь его, чтобы я мог запускать NODE.JS приложение в процессе bash, как в I, при локальном развертывании.
Если я отброшу этот код и использую pm2, все будет работать, как ожидалось, и он перезапустится, но я не могу найти способ передать …?foo=123 информацию в новый экземпляр, поскольку NODE.JS параметр процесса неприменим. Я также пробовал process.env, но я считаю, что он не является общим для всех процессов. У меня есть возможность сохранить в файле как план «d», но мне было интересно, можно ли это сделать более чистым способом.
Комментарии:
1. Привет, взгляните на эту статью: docs.docker.com/config/containers /…
2. Привет, спасибо за информацию. Это нормально, но моя проблема на данный момент не связана с перезапуском. Вот как я могу поделиться состоянием (в этом случае мне нужно передать идентификатор из 1-го процесса во 2-й процесс моего приложения node-js).
3. Хм, совместное использование состояния между экземплярами должно выполняться через третью службу, такую как Redis. Взгляните на эту статью: bizety.com/2018/08/21 /…
4. Привет, просто хочу, когда я перезапущу node.js приложение должно иметь параметр процесса типа «node app -foo = 1234», и это значение (1234) задается до перезапуска приложения. Это идентификатор, который мне нужен для загрузки данных инициализации для приложения. Я знаю, что это не идеально, но мы не можем реализовать какой-то механизм хранения для сохранения этого между экземплярами
Ответ №1:
После того, как я подумал лучше и немного больше изучил, я решил в своем Dockerfile, помимо запуска моего Node.js Приложение, запустите другой процесс, который предотвратил бы остановку контейнера docker при перезапуске узла.Приложение Js.
Докерфайл
(...)
CMD ["/app/bash-script.sh"]
bash-script.sh
//run Node.js app
npm run start
tail -f /dev/null amp;
bash_process_id=$!
wait $bash_process_id;
Преимущество этого заключается в том, что я могу использовать код «child_process» в вопросе. Чтобы перезапустить Node.js приложение и передать по параметру некоторую информацию. Также я мог бы использовать process.env.