Как перезапустить узел.Веб-приложение Js при развертывании в Docker

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