Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Creating Docker Actions with OpenWhisk

DZone's Guide to

Creating Docker Actions with OpenWhisk

A brief intro to OpenWhisk with a simple JavaScript example.

· Web Dev Zone
Free Resource

Discover how to focus on operators for Reactive Programming and how they are essential to react to data in your application.  Brought to you in partnership with Wakanda

OpenWhisk is an event-driven computer platform that executes code in response to events or direct invocations. The advantage is that you only have to pay for actual usage, not for peaked projections. Developers can implement actions via JavaScript, Swift, and, as described below, Docker.

Via Docker, programming languages other than JavaScript and Swift can be used. Plus, with Docker you can write JavaScript actions that require more Node modules than are currently supported by OpenWhisk JavaScript actions.

There is documentation available describing how to use Docker in this context. When I first read it, I was a little confused because the documentation describes how to build an image with JavaScript code that calls C code. The C part, however, is only a sample and you don’t have to use anything related to C if you want to build a Docker image with JavaScript.

Here is a simple hello world JavaScript sample. The following snippet shows the file app.js and how to read input parameters and return output:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());

app.post('/init', function (req, res) {
   res.status(200).send();       
});

app.post('/run', function (req, res) {
   var meta = (req.body || {}).meta;
   var value = (req.body || {}).value;
   var payload = value.payload; 
   if (typeof payload != 'string')
      payload = JSON.stringify(payload);
   console.log("payload: " + payload);
   var result = { 'result' : { 'msg' : 'echo', 'payload' : payload} }; 
   res.status(200).json(result);
});

app.listen(8080, function () {
})


Here is the package.json to which more dependencies can be added:

{
  "name": "openwhisk-docker-node",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "dependencies": {
    "express": "^4.11.2",
    "body-parser": "^1.11.0"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": ""
}


The Dockerfile extends the IBM Node image:

FROM registry.ng.bluemix.net/ibmnode
ADD ./app.js ./
ADD ./node_modules/ ./node_modules/
ENV NODE_ENV production
EXPOSE 8080
CMD ["node", "app.js"]


Invoke these commands to run the code. At this point, images need to be pushed to DockerHub:

npm install
docker build -t nheidloff/open-whisk-docker-node .
docker push nheidloff/open-whisk-docker-node
wsk action create --docker docker-node nheidloff/open-whisk-docker-node
wsk action invoke --blocking --result docker-node --param payload niklas


The dashboard shows the successful invocation.

Image title


Learn how divergent branches can appear in your repository and how to better understand why they are called “branches".  Brought to you in partnership with Wakanda

Topics:
docker ,openwhisk

Published at DZone with permission of Niklas Heidloff, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

THE DZONE NEWSLETTER

Dev Resources & Solutions Straight to Your Inbox

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

X

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}