UNPKG

simple-dockerode

Version:

Wraps Dockerode container exec function to make it easier to use

107 lines (91 loc) 3.01 kB
'use strict'; const Dockerode = require('dockerode'); const processExec = require('./processExec'); /** * Process the arguments to pass into {@link processExec} * @param {Array} args A spread parameter to catch all arguments. Broken into later arguments. * @param {Array<string>} Cmd An array of strings, specifying an exec-style array of arguments. * @param {Object} [opts] An optional object of parameters. * @param {function} [callback] An optional callback. If omitted, the function will return a Promise. * @returns {Promise} If no callback is given, return a Promise. */ function processArgs(...args) { let Cmd; let opts; let callback; // Polymorphism switch(args.length) { default: throw new Error('Need arguments'); case 1: Cmd = args[0]; opts = {}; break; case 2: Cmd = args[0]; if( typeof args[1] === 'object' ) { opts = args[1]; } else if( typeof args[1] === 'function' ) { callback = args[1]; opts = {}; } else { throw new Error('Second argument cannot be anything but an object or a function'); } break; case 3: [Cmd, opts, callback] = args; break; } let createOpts = Object.assign({Cmd, AttachStdin: false, AttachStdout: false, AttachStderr: false}); let execOpts = {Detach: true, hijack: false}; if( opts.stdin || opts.stdout || opts.stderr ) { execOpts.hijack = true; execOpts.Detach = false; } if( opts.stdin ) { createOpts.AttachStdin = true; execOpts.stdin = true; } if( opts.stdout ) { createOpts.AttachStdout = true; } if( opts.stderr ) { createOpts.AttachStderr = true; } if( opts.live ) { if( execOpts.Detach ) { const err = new Error('The live option requires that you also pass stdout, stderr, or stdin.'); if( !callback ) { return Promise.reject(err); } return callback(err); } } // Override any options with anything specified in createOpts if( opts.createOpts ) { Object.assign(createOpts, opts.createOpts); } // Override any options with anything specified in execOpts if( opts.execOpts ) { Object.assign(execOpts, opts.execOpts); } if( !callback ) { return new Promise((resolve, reject) => processExec.call(this, opts, createOpts, execOpts, (err, results) => err ? reject(err, results) : resolve(results)) ); } return processExec.call(this, opts, createOpts, execOpts, callback); } /** * A class to simplify certain functions that work with containers. */ class SimpleDockerode extends Dockerode { constructor(...args) { super(...args); } /** * Wrapper for Dockerode's native function, to swap exec for {@link processArgs} * @param {Array} args A spread parameter, passed through to Dockerode's getContainer */ getContainer(...args) { const container = super.getContainer(...args); container.execRaw = container.exec; container.exec = processArgs; return container; } } module.exports = SimpleDockerode;