// simple node web server that displays hello world // optimized for Docker image var express = require('express'); // this example uses express web framework so we know what longer build times // do and how Dockerfile layer ordering matters. If you mess up Dockerfile ordering // you'll see long build times on every code change + build. If done correctly, // code changes should be only a few seconds to build locally due to build cache. var morgan = require('morgan'); // morgan provides easy logging for express, and by default it logs to stdout // which is a best practice in Docker. Friends don't let friends code their apps to // do app logging to files in containers. // Constants const PORT = process.env.PORT || 8080; // if you're not using docker-compose for local development, this will default to 8080 // to prevent non-root permission problems with 80. Dockerfile is set to make this 80 // because containers don't have that issue :) // Appi var app = express(); app.use(morgan('common')); app.get('/', function (req, res) { res.send('Hello Docker World\n'); }); app.get('/healthz', function (req, res) { // do app logic here to determine if app is truly healthy // you should return 200 if healthy, and anything else will fail // if you want, you should be able to restrict this to localhost (include ipv4 and ipv6) res.send('I am happy and healthy\n'); }); var server = app.listen(PORT, function () { console.log('Webserver is ready'); }); // // need this in docker container to properly exit since node doesn't handle SIGINT/SIGTERM // this also won't work on using npm start since: // https://github.com/npm/npm/issues/4603 // https://github.com/npm/npm/pull/10868 // https://github.com/RisingStack/kubernetes-graceful-shutdown-example/blob/master/src/index.js // if you want to use npm then start with `docker run --init` to help, but I still don't think it's // a graceful shutdown of node process // // quit on ctrl-c when running docker in terminal process.on('SIGINT', function onSigint () { console.info('Got SIGINT (aka ctrl-c in docker). Graceful shutdown ', new Date().toISOString()); shutdown(); }); // quit properly on docker stop process.on('SIGTERM', function onSigterm () { console.info('Got SIGTERM (docker container stop). Graceful shutdown ', new Date().toISOString()); shutdown(); }) // shut down server function shutdown() { server.close(function onServerClosed (err) { if (err) { console.error(err); process.exitCode = 1; } process.exit(); }) } // // need above in docker container to properly exit // module.exports = app;