Description: In this post I'm gonna show you how to create Docker Image for Nodejs project using Grunt.
Note:
Grunt: Its a Javascript task runner. In this project we'll use for minification of our .js file.
Docker: Its a platform where we gonna place containerised image of our NodeJs Project.
Github Project
So lets get started.
Step 1: Create index.js
//Import Express var express = require('express') var app = express() //Import Path var path = require('path') //Mounting our .js from build folder. app.use("/build", express.static(__dirname + "/build")) //Capture the base url app.get('/', function(req, res){ res.sendFile(__dirname + "/index.html") }) //Listen on port 9000 app.listen(9000, function(){ console.log('Lisening on port 9000') })
Note: build folder will be created after we run our Gruntfile
Step 2: Create package.json
{ "name": "demo-docker-nodejs-grunt", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "build": "grunt uglify", "start": "node index.js" }, "author": "coderconsole", "license": "ISC", "dependencies": { "express": "^4.17.1", "grunt": "^1.0.4", "grunt-cli": "^1.3.2", "grunt-contrib-uglify": "^4.0.1" } }
Note:
dependencies: Its contains all the dependencies we needed within the project.
scripts: Its contains grunt uglify to minify our .js and and start to start the nodejs app.
Step 3: Create Gruntfile.js parallel to package.json and echo.js within src/ folder(just to separate our code structure)
Gruntfile.js
//Setting grunt module.exports = function(grunt){ //Setting Init Config from package.json grunt.initConfig({ //Read package.json and assign it to 'pkg' pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, build: { src: 'src/echo.js', dest: 'build/echo.min.js' } } }); // Load "uglify" task grunt.loadNpmTasks('grunt-contrib-uglify') // Load default task grunt.registerTask('default', ['uglify']) };
echo.js within src/ folder
function echoNameFunction(data) { return "<h2>Welcome " + data + "</h2>" }
Step 4: Create Dockerfile
# Select the Node Module FROM node:11 # Add the working Directory WORKDIR /app # COPY out package.json to our working directory /app COPY package*.json /app/ # RUN npm install which will download all the dependencies from package.json RUN npm install # COPY the current content to /app folder structure COPY . /app/ # UGLIFY the src/*.js RUN npm run build # EXPOSE our port EXPOSE 9000 # Create EntryPoint of index.js file ENTRYPOINT ["node", "index.js"]
Note: Dockerfile contains steps which get executed sequentially. Please read comments for what each steps does.
Step 5: Create index.html
<html lang="en"> <head> <script src="build/echo.min.js"></script> <script> function display(){ var name = document.getElementById('firstname').value document.getElementById('display').innerHTML = echoNameFunction(name) } </script> </head> <body> <label for="firstname">Enter your first name</label> <input id="firstname" name="firstname" type="text"/> <button onclick="display()"> Click! <p id="display"></p> </body> </html>
Step 6: Create .dockerignore file to avoid node_modules or build folder get added into the image
**/node_modules build/*.js .idea/
Step 7: Finally, lets create our docker image and run it using below command.
Build Docker image
docker build -t docker-node-grunt:1.0.0 -f Dockerfile .
Run Docker image
docker run -p 9000:9000 docker-node-grunt:1.0.0
Now, open browser and hit url http://localhost:9000/
Bingo! We've successfully deployed our nodeJs application in docker using grunt.
Github Project
#codingIsAnArt