mecano
Version:
Common functions for system deployment.
153 lines (150 loc) • 3.84 kB
JavaScript
// 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');