I am refactoring a couple of node.js services. All of them used to start with forever
on virtual servers, if the process crashed they just relaunch.
Now
My take is do not use an in-container process supervisor (forever, pm2) and instead use docker restart policy via the --restart=always
(or one of the other flavors of that option). This is more inline with the overall docker philosophy, and should operate very similarly to in-container process supervision since docker containers start running very quickly.
The strongest advocate for running in-container process supervision I've seen is in the phusion baseimage-docker README if you want to explore the other position on this topic.
Node needs clustering setup if you are running on a server with multiple CPUs.
With PM2 you get that without writing any extra code. http://pm2.keymetrics.io/docs/usage/cluster-mode/
Unless you are using a bunch of servers with single CPU instances than i would say use PM2 in production.
pm2 will also be quicker to restart than docker
While it's a good idea to use --restart=always
as a failsafe, container restarting is relatively slow (5+ seconds with the simple Hello World Node server described here), so you can minimize app downtime using something like forever
.
A downside of restarting the process within the container is that crash recovery can now happen two ways, which might have implications for your monitoring, etc.