mirror of https://github.com/docker/docs.git
179 lines
6.0 KiB
JavaScript
179 lines
6.0 KiB
JavaScript
import _ from 'underscore';
|
|
import path from 'path';
|
|
import Promise from 'bluebird';
|
|
import fs from 'fs';
|
|
import util from './Util';
|
|
|
|
var DockerMachine = {
|
|
command: function () {
|
|
if (util.isWindows()) {
|
|
return path.join(process.env.DOCKER_TOOLBOX_INSTALL_PATH, 'docker-machine.exe');
|
|
} else {
|
|
return '/usr/local/bin/docker-machine';
|
|
}
|
|
},
|
|
name: function () {
|
|
return 'default';
|
|
},
|
|
installed: function () {
|
|
if (util.isWindows() && !process.env.DOCKER_TOOLBOX_INSTALL_PATH) {
|
|
return false;
|
|
}
|
|
return fs.existsSync(this.command());
|
|
},
|
|
version: function () {
|
|
return util.exec([this.command(), '-v']).then(stdout => {
|
|
try {
|
|
var matchlist = stdout.match(/(\d+\.\d+\.\d+).*/);
|
|
if (!matchlist || matchlist.length < 2) {
|
|
return Promise.reject('docker-machine -v output format not recognized.');
|
|
}
|
|
return Promise.resolve(matchlist[1]);
|
|
} catch (err) {
|
|
return Promise.resolve(null);
|
|
}
|
|
}).catch(() => {
|
|
return Promise.resolve(null);
|
|
});
|
|
},
|
|
isoversion: function (machineName = this.name()) {
|
|
try {
|
|
var data = fs.readFileSync(path.join(util.home(), '.docker', 'machine', 'machines', machineName, 'boot2docker.iso'), 'utf8');
|
|
var match = data.match(/Boot2Docker-v(\d+\.\d+\.\d+)/);
|
|
if (match) {
|
|
return match[1];
|
|
} else {
|
|
return null;
|
|
}
|
|
} catch (err) {
|
|
return null;
|
|
}
|
|
},
|
|
exists: function (machineName = this.name()) {
|
|
return this.status(machineName).then(() => {
|
|
return true;
|
|
}).catch(() => {
|
|
return false;
|
|
});
|
|
},
|
|
create: function (machineName = this.name()) {
|
|
return util.exec([this.command(), '-D', 'create', '-d', 'virtualbox', '--virtualbox-memory', '2048', machineName]);
|
|
},
|
|
start: function (machineName = this.name()) {
|
|
return util.exec([this.command(), '-D', 'start', machineName]);
|
|
},
|
|
stop: function (machineName = this.name()) {
|
|
return util.exec([this.command(), 'stop', machineName]);
|
|
},
|
|
upgrade: function (machineName = this.name()) {
|
|
return util.exec([this.command(), 'upgrade', machineName]);
|
|
},
|
|
rm: function (machineName = this.name()) {
|
|
return util.exec([this.command(), 'rm', '-f', machineName]);
|
|
},
|
|
ip: function (machineName = this.name()) {
|
|
return util.exec([this.command(), 'ip', machineName]).then(stdout => {
|
|
return Promise.resolve(stdout.trim().replace('\n', ''));
|
|
});
|
|
},
|
|
url: function (machineName = this.name()) {
|
|
return util.exec([this.command(), 'url', machineName]).then(stdout => {
|
|
return Promise.resolve(stdout.trim().replace('\n', ''));
|
|
});
|
|
},
|
|
regenerateCerts: function (machineName = this.name()) {
|
|
return util.exec([this.command(), 'tls-regenerate-certs', '-f', machineName]);
|
|
},
|
|
status: function (machineName = this.name()) {
|
|
return util.exec([this.command(), 'status', machineName]).then(stdout => {
|
|
return Promise.resolve(stdout.trim().replace('\n', ''));
|
|
});
|
|
},
|
|
disk: function (machineName = this.name()) {
|
|
return util.exec([this.command(), 'ssh', machineName, 'df']).then(stdout => {
|
|
try {
|
|
var lines = stdout.split('\n');
|
|
var dataline = _.find(lines, function (line) {
|
|
return line.indexOf('/dev/sda1') !== -1;
|
|
});
|
|
var tokens = dataline.split(' ');
|
|
tokens = tokens.filter(function (token) {
|
|
return token !== '';
|
|
});
|
|
var usedGb = parseInt(tokens[2], 10) / 1000000;
|
|
var totalGb = parseInt(tokens[3], 10) / 1000000;
|
|
var percent = parseInt(tokens[4].replace('%', ''), 10);
|
|
return {
|
|
used_gb: usedGb.toFixed(2),
|
|
total_gb: totalGb.toFixed(2),
|
|
percent: percent
|
|
};
|
|
} catch (err) {
|
|
return Promise.reject(err);
|
|
}
|
|
});
|
|
},
|
|
memory: function (machineName = this.name()) {
|
|
return util.exec([this.command(), 'ssh', machineName, 'free -m']).then(stdout => {
|
|
try {
|
|
var lines = stdout.split('\n');
|
|
var dataline = _.find(lines, function (line) {
|
|
return line.indexOf('-/+ buffers') !== -1;
|
|
});
|
|
var tokens = dataline.split(' ');
|
|
tokens = tokens.filter((token) => {
|
|
return token !== '';
|
|
});
|
|
var usedGb = parseInt(tokens[2], 10) / 1000;
|
|
var freeGb = parseInt(tokens[3], 10) / 1000;
|
|
var totalGb = usedGb + freeGb;
|
|
var percent = Math.round(usedGb / totalGb * 100);
|
|
return {
|
|
used_gb: usedGb.toFixed(2),
|
|
total_gb: totalGb.toFixed(2),
|
|
free_gb: freeGb.toFixed(2),
|
|
percent: percent
|
|
};
|
|
} catch (err) {
|
|
return Promise.reject(err);
|
|
}
|
|
});
|
|
},
|
|
dockerTerminal: function (cmd, machineName = this.name()) {
|
|
if (util.isWindows()) {
|
|
cmd = cmd || '';
|
|
this.url(machineName).then(machineUrl => {
|
|
util.exec('start powershell.exe ' + cmd,
|
|
{env: {
|
|
'DOCKER_HOST': machineUrl,
|
|
'DOCKER_CERT_PATH': path.join(util.home(), '.docker', 'machine', 'machines', machineName),
|
|
'DOCKER_TLS_VERIFY': 1
|
|
}
|
|
});
|
|
});
|
|
} else if (util.isLinux()) {
|
|
cmd = cmd || process.env.SHELL;
|
|
var terminal = util.linuxTerminal();
|
|
if (terminal)
|
|
util.exec(terminal.concat([cmd])).then(() => {});
|
|
} else {
|
|
cmd = cmd || process.env.SHELL;
|
|
this.url(machineName).then(machineUrl => {
|
|
util.exec([path.join(process.env.RESOURCES_PATH, 'terminal'), `DOCKER_HOST=${machineUrl} DOCKER_CERT_PATH=${path.join(util.home(), '.docker/machine/machines/' + machineName)} DOCKER_TLS_VERIFY=1 ${cmd}`]).then(() => {});
|
|
});
|
|
}
|
|
},
|
|
virtualBoxLogs: function (machineName = this.name()) {
|
|
let logsPath = path.join(util.home(), '.docker', 'machine', 'machines', machineName, machineName, 'Logs', 'VBox.log');
|
|
let logData = null;
|
|
try {
|
|
logData = fs.readFileSync(logsPath, 'utf8');
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
return logData;
|
|
}
|
|
};
|
|
|
|
module.exports = DockerMachine;
|