UNPKG

mecano

Version:

Common functions for system deployment.

153 lines (150 loc) 3.84 kB
// Generated by CoffeeScript 1.11.1 var docker; module.exports = function(options, callback) { var cmd, flag, i, k, len, opt, p, ref, ref1, ref2, ref3, ref4, ref5, v; options.log({ message: "Entering Docker run", level: 'DEBUG', module: 'mecano/lib/docker/run' }); if (options.docker == null) { options.docker = {}; } ref = options.docker; for (k in ref) { v = ref[k]; if (options[k] == null) { options[k] = v; } } if (options.image == null) { return callback(Error('Missing image')); } if (options.rm == null) { options.rm = true; } if (options.name == null) { options.name = options.container; } if (!((options.name != null) || options.rm)) { options.log({ message: "Should specify a container name if rm is false", level: 'WARN', module: 'mecano/docker/run' }); } cmd = 'run'; ref1 = { name: '--name', hostname: '-h', cpu_shares: '-c', cgroup_parent: '--cgroup-parent', cid_file: '--cidfile', blkio_weight: '--blkio-weight', cpuset_cpus: '--cpuset-cpus', entrypoint: '--entrypoint', ipc: '--ipc', log_driver: '--log-driver', memory: '-m', mac_address: '--mac-address', memory_swap: '--memory-swap', net: '--net', pid: '--pid', cwd: '-w' }; for (opt in ref1) { flag = ref1[opt]; if (options[opt] != null) { cmd += " " + flag + " " + options[opt]; } } if (options.detach) { cmd += ' -d'; } ref2 = { rm: '--rm', publish_all: '-P', privileged: '--privileged', read_only: '--read-only' }; for (opt in ref2) { flag = ref2[opt]; if (options[opt]) { cmd += " " + flag; } } ref3 = { port: '-p', volume: '-v', device: '--device', label: '-l', label_file: '--label-file', expose: '--expose', env: '-e', env_file: '--env-file', dns: '--dns', dns_search: '--dns-search', volumes_from: '--volumes-from', cap_add: '--cap-add', cap_drop: '--cap-drop', ulimit: '--ulimit', add_host: '--add-host' }; for (opt in ref3) { flag = ref3[opt]; if (options[opt] != null) { if (typeof options[opt] === 'string' || typeof options[opt] === 'number') { cmd += " " + flag + " " + options[opt]; } else if (Array.isArray(options[opt])) { ref4 = options[opt]; for (i = 0, len = ref4.length; i < len; i++) { p = ref4[i]; if ((ref5 = typeof p) === 'string' || ref5 === 'number') { cmd += " " + flag + " " + p; } else { callback(Error("Invalid parameter, '" + opt + "' array should only contains string or number")); } } } else { callback(Error("Invalid parameter, '" + opt + "' should be string, number or array")); } } } cmd += " " + options.image; if (options.cmd) { cmd += " " + options.cmd; } delete options.cmd; this.execute({ "if": options.name != null, cmd: docker.wrap(options, "ps -a | grep '" + options.name + "'"), code_skipped: 1, shy: true }, function(err, running) { docker.callback.apply(docker, arguments); if (running) { return options.log({ message: "Container already running. Skipping", level: 'INFO', module: 'mecano/docker/run' }); } }); return this.execute({ cmd: docker.wrap(options, cmd), "if": function() { return (options.name == null) || this.status(-1) === false; } }, function(err, running) { docker.callback.apply(docker, arguments); if (running) { options.log({ message: "Container now running", level: 'WARN', module: 'mecano/docker/run' }); } return callback.apply(null, arguments); }); }; docker = require('../misc/docker');