dockerskeleton base image is useful for actions that run scripts (e.g., bash, perl, python) and compiled binaries or, more generally, any native executable. It provides a proxy service (using Flask, a Python web microframework) that implements the required
/run routes to interact with the OpenWhisk invoker service. The implementation of these routes is encapsulated in a class named
ActionRunner which provides a basic framework for receiving code from an invoker, preparing it for execution, and then running the code when required.
The initialization of the
ActionRunner is done via
init() which receives a JSON object containing a
code property whose value is the source code to execute. It writes the source to a
source file. This method also provides a hook to optionally augment the received code via an
epilogue() method, and then performs a
build() to generate an executable. The last step of the initialization applies
verify() to confirm the executable has the proper permissions to run the code. The action runner is ready to run the action if
verify() is true.
The default implementations of
build() are no-ops and should be overridden as needed. The base image contains a stub added which is already executable by construction via
docker build. For language runtimes (e.g., C) that require compiling the source, the extending class should run the required source compiler during
run() method runs the action via the executable generated during
init(). This method is only called by the proxy service if
verify() is true.
ActionRunner subclasses are encouraged to override this method if they have additional logic that should cause
run() to never execute. The
run() method calls the executable via a process and sends the received input parameters (from the invoker) to the action via the command line (as a JSON string argument). Additional properties received from the invoker are passed on to the action via environment variables as well. To augment the action environment, override
By convention the action executable may log messages to
stderr. The proxy requires that the last line of output to
stdout is a valid JSON object serialized to string if the action returns a JSON result. A return value is optional but must be a JSON object (properly serialized) if present.
For an example implementation of an
ActionRunner that overrides
build() see the Swift 3.x action proxy. An implementation of the runner for Python actions is available here. Lastly, an example Docker action that uses
C is available in this example.