mirror of https://github.com/docker/docs.git
Merge branch 'style-polish'
Conflicts: src/components/ContainerHomeFolders.react.js src/components/Containers.react.js styles/right-panel.less styles/variables.less
This commit is contained in:
commit
ccb1c5f214
|
@ -18,13 +18,14 @@ Before you fil an issue or a pull request, quickly read of the following tips on
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
Most of the time, you'll have installed Kitematic before contibuting, but for the
|
Most of the time, you'll have installed Kitematic before contibuting, but for the
|
||||||
sake of completeness, you can also install [Node.js](https://nodejs.org/) and the latest Xcode from the Apple App Store and then run from your Git clone.
|
sake of completeness, you can also install [Node.js 0.10.38](https://nodejs.org/dist/v0.10.38/).
|
||||||
|
|
||||||
Running `npm start` will download and install the OS X Docker client,
|
### Other Prerequisites (Mac)
|
||||||
[Docker machine](https://github.com/docker/machine),
|
- The latest Xcode from the Apple App Store.
|
||||||
the [Boot2Docker iso](https://github.com/boot2docker/boot2docker),
|
|
||||||
[Electron](http://electron.atom.io/), and [VirtualBox](https://www.virtualbox.org/)
|
### Other Prerequisites (Windows)
|
||||||
if needed.
|
- [Visual Studio 2013 Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) (or similar)
|
||||||
|
- [Python](https://www.python.org/downloads/release/python-2710/)
|
||||||
|
|
||||||
### Getting Started
|
### Getting Started
|
||||||
|
|
||||||
|
@ -34,6 +35,11 @@ To run the app in development:
|
||||||
|
|
||||||
- `npm start`
|
- `npm start`
|
||||||
|
|
||||||
|
Running `npm start` will download and install the OS X Docker client,
|
||||||
|
[Docker Machine](https://github.com/docker/machine), [Docker Compose](https://github.com/docker/compose)
|
||||||
|
the [Boot2Docker iso](https://github.com/boot2docker/boot2docker),
|
||||||
|
[Electron](http://electron.atom.io/).
|
||||||
|
|
||||||
### Building & Release
|
### Building & Release
|
||||||
|
|
||||||
- `npm run release`
|
- `npm run release`
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
module.exports = {
|
||||||
|
require: jest.genMockFunction(),
|
||||||
|
match: jest.genMockFunction()
|
||||||
|
};
|
|
@ -28,10 +28,9 @@ container!
|
||||||
|
|
||||||
## Technical Details
|
## Technical Details
|
||||||
|
|
||||||
Kitematic is a self-contained .app, with a two exceptions:
|
Kitematic is a self-contained .app, with an exception:
|
||||||
|
|
||||||
- It will install VirtualBox if it's not already installed.
|
- It will install VirtualBox if it's not already installed.
|
||||||
- It copies the `docker` and `docker-machine` binaries to `/usr/local/bin` for
|
|
||||||
convenience.
|
convenience.
|
||||||
|
|
||||||
### Why does Kitematic need my root password?
|
### Why does Kitematic need my root password?
|
||||||
|
|
105
gulpfile.js
105
gulpfile.js
|
@ -14,6 +14,9 @@ var plumber = require('gulp-plumber');
|
||||||
var runSequence = require('run-sequence');
|
var runSequence = require('run-sequence');
|
||||||
var shell = require('gulp-shell');
|
var shell = require('gulp-shell');
|
||||||
var sourcemaps = require('gulp-sourcemaps');
|
var sourcemaps = require('gulp-sourcemaps');
|
||||||
|
var execFile = require('child_process').execFile;
|
||||||
|
var request = require('request');
|
||||||
|
var path = require('path');
|
||||||
|
|
||||||
var dependencies = Object.keys(packagejson.dependencies);
|
var dependencies = Object.keys(packagejson.dependencies);
|
||||||
var argv = require('minimist')(process.argv.slice(2));
|
var argv = require('minimist')(process.argv.slice(2));
|
||||||
|
@ -175,16 +178,96 @@ gulp.task('settings', function () {
|
||||||
string_src('settings.json', JSON.stringify(settings)).pipe(gulp.dest('dist/osx/' + options.appFilename.replace(' ', '\ ').replace('(','\(').replace(')','\)') + '/Contents/Resources/app'));
|
string_src('settings.json', JSON.stringify(settings)).pipe(gulp.dest('dist/osx/' + options.appFilename.replace(' ', '\ ').replace('(','\(').replace(')','\)') + '/Contents/Resources/app'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('download-deps', function () {
|
var version = function (str) {
|
||||||
if(process.platform === 'win32') {
|
var match = str.match(/(\d+\.\d+\.\d+)/);
|
||||||
return gulp.src('').pipe(
|
if (match) {
|
||||||
shell(['powershell.exe -ExecutionPolicy unrestricted -File util\\deps.ps1'])
|
return match[1];
|
||||||
);
|
} else {
|
||||||
} else {
|
return null;
|
||||||
return gulp.src('').pipe(
|
}
|
||||||
shell(['./util/deps'])
|
};
|
||||||
);
|
|
||||||
|
gulp.task('download-docker', function (cb) {
|
||||||
|
if (process.platform === 'win32' && fs.existsSync(path.join('resources', 'docker.exe'))) {
|
||||||
|
cb();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
execFile(path.join('resources', 'docker'), ['-v'], function (err, stdout, stderr) {
|
||||||
|
var currentVersion = version(stdout);
|
||||||
|
if (currentVersion && currentVersion === packagejson['docker-version']) {
|
||||||
|
cb();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gutil.log(gutil.colors.green('Downloading Docker'));
|
||||||
|
|
||||||
|
if(process.platform === 'win32') {
|
||||||
|
request('https://master.dockerproject.com/windows/amd64/docker-1.7.0-dev.exe').pipe(fs.createWriteStream('./resources/docker.exe')).on('finish', cb);
|
||||||
|
} else {
|
||||||
|
request('https://get.docker.com/builds/Darwin/x86_64/docker-' + packagejson['docker-version'])
|
||||||
|
.pipe(fs.createWriteStream('./resources/docker')).on('finish', function () {
|
||||||
|
fs.chmodSync('./resources/docker', 0755);
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('download-docker-machine', function (cb) {
|
||||||
|
execFile(path.join('resources', 'docker-machine'), ['-v'], function (err, stdout, stderr) {
|
||||||
|
var currentVersion = version(stdout);
|
||||||
|
if (currentVersion && currentVersion === version(packagejson['docker-machine-version'])) {
|
||||||
|
cb();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gutil.log(gutil.colors.green('Downloading Docker Machine'));
|
||||||
|
|
||||||
|
if(process.platform === 'win32') {
|
||||||
|
request('https://github.com/docker/machine/releases/download/v' + packagejson['docker-machine-version'] + '/docker-machine_windows-amd64.exe')
|
||||||
|
.pipe(fs.createWriteStream('./resources/docker-machine.exe')).on('finish', function () {cb()});
|
||||||
|
} else {
|
||||||
|
request('https://github.com/docker/machine/releases/download/v' + packagejson['docker-machine-version'] + '/docker-machine_darwin-amd64')
|
||||||
|
.pipe(fs.createWriteStream('./resources/docker-machine')).on('finish', function () {
|
||||||
|
fs.chmodSync('./resources/docker-machine', 0755);
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('download-docker-compose', function (cb) {
|
||||||
|
execFile(path.join('resources', 'docker-compose'), ['--version'], function (err, stdout, stderr) {
|
||||||
|
var currentVersion = version(stdout);
|
||||||
|
if (currentVersion && currentVersion === packagejson['docker-compose-version']) {
|
||||||
|
cb();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(process.platform === 'win32') {
|
||||||
|
// Todo: install windows version of compose
|
||||||
|
cb();
|
||||||
|
} else {
|
||||||
|
gutil.log(gutil.colors.green('Downloading Docker Compose'));
|
||||||
|
request('https://github.com/docker/compose/releases/download/' + packagejson['docker-compose-version'] + '/docker-compose-Darwin-x86_64')
|
||||||
|
.pipe(fs.createWriteStream('./resources/docker-compose')).on('finish', function () {
|
||||||
|
fs.chmodSync('./resources/docker-compose', 0755);
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('download-boot2docker-iso', function (cb) {
|
||||||
|
var b2dFile = path.join('resources', 'boot2docker-' + packagejson['docker-version'] + '.iso');
|
||||||
|
if (!fs.existsSync(b2dFile)) {
|
||||||
|
gutil.log(gutil.colors.green('Downloading Boot2Docker iso'));
|
||||||
|
request('https://github.com/boot2docker/boot2docker/releases/download/v' + packagejson['docker-version'] + '/boot2docker.iso')
|
||||||
|
.pipe(fs.createWriteStream(b2dFile)).on('finish', cb);
|
||||||
|
} else {
|
||||||
|
cb();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('reset', function () {
|
gulp.task('reset', function () {
|
||||||
|
@ -200,10 +283,10 @@ gulp.task('reset', function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('release', function () {
|
gulp.task('release', function () {
|
||||||
runSequence('download-deps', 'download', 'dist', ['copy', 'images', 'js', 'styles', 'settings'], 'sign', 'zip');
|
runSequence('download-docker', 'download-docker-machine', 'download-docker-compose', 'download-boot2docker-iso', 'download', 'dist', ['copy', 'images', 'js', 'styles', 'settings'], 'sign', 'zip');
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('default', ['download-deps', 'download', 'copy', 'js', 'images', 'styles'], function () {
|
gulp.task('default', ['download-docker', 'download-docker-machine', 'download-docker-compose', 'download-boot2docker-iso', 'download', 'copy', 'js', 'images', 'styles'], function () {
|
||||||
gulp.watch('src/**/*.js', ['js']);
|
gulp.watch('src/**/*.js', ['js']);
|
||||||
gulp.watch('index.html', ['copy']);
|
gulp.watch('index.html', ['copy']);
|
||||||
gulp.watch('styles/**/*.less', ['styles']);
|
gulp.watch('styles/**/*.less', ['styles']);
|
||||||
|
|
|
@ -6,6 +6,6 @@
|
||||||
<title>Kitematic</title>
|
<title>Kitematic</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<script src="app.js"></script>
|
<script src="main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"testDirectoryName": "__integration__",
|
"testDirectoryName": "__integration__",
|
||||||
"scriptPreprocessor": "<rootDir>/util/preprocessor.js",
|
"scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
|
||||||
"setupEnvScriptFile": "<rootDir>/util/testenv.js",
|
"setupEnvScriptFile": "<rootDir>/util/testenv.js",
|
||||||
"setupTestFrameworkScriptFile": "<rootDir>/util/prepare.js",
|
"setupTestFrameworkScriptFile": "<rootDir>/util/prepare.js",
|
||||||
"unmockedModulePathPatterns": [
|
"unmockedModulePathPatterns": [
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"scriptPreprocessor": "<rootDir>/util/preprocessor.js",
|
"scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
|
||||||
"setupEnvScriptFile": "<rootDir>/util/testenv.js",
|
"setupEnvScriptFile": "<rootDir>/util/testenv.js",
|
||||||
"setupTestFrameworkScriptFile": "<rootDir>/util/prepare.js",
|
"setupTestFrameworkScriptFile": "<rootDir>/util/prepare.js",
|
||||||
"unmockedModulePathPatterns": [
|
"unmockedModulePathPatterns": [
|
||||||
|
@ -9,10 +9,10 @@
|
||||||
"net",
|
"net",
|
||||||
"crypto",
|
"crypto",
|
||||||
"babel",
|
"babel",
|
||||||
"<rootDir>/node_modules/.*JSONStream",
|
"bluebird",
|
||||||
"<rootDir>/node_modules/object-assign",
|
"object-assign",
|
||||||
"<rootDir>/node_modules/underscore",
|
"underscore",
|
||||||
"<rootDir>/node_modules/bluebird",
|
"source-map-support",
|
||||||
"<rootDir>/node_modules/source-map-support"
|
"<rootDir>/node_modules/.*JSONStream"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "Kitematic",
|
"name": "Kitematic",
|
||||||
"version": "0.6.3",
|
"version": "0.6.5",
|
||||||
"author": "Kitematic",
|
"author": "Kitematic",
|
||||||
"description": "Simple Docker Container management for Mac OS X.",
|
"description": "Simple Docker Container management for Mac OS X.",
|
||||||
"homepage": "https://kitematic.com/",
|
"homepage": "https://kitematic.com/",
|
||||||
|
@ -26,9 +26,9 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"docker-version": "1.6.2",
|
"docker-version": "1.6.2",
|
||||||
"docker-machine-version": "0.2.0",
|
"docker-machine-version": "0.3.0-rc2",
|
||||||
"docker-compose-version": "1.2.0",
|
"docker-compose-version": "1.2.0",
|
||||||
"electron-version": "0.26.0",
|
"electron-version": "0.27.2",
|
||||||
"virtualbox-version": "4.3.28",
|
"virtualbox-version": "4.3.28",
|
||||||
"virtualbox-filename": "VirtualBox-4.3.28.pkg",
|
"virtualbox-filename": "VirtualBox-4.3.28.pkg",
|
||||||
"virtualbox-filename-win": "VirtualBox-4.3.28.exe",
|
"virtualbox-filename-win": "VirtualBox-4.3.28.exe",
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
"react": "^0.13.1",
|
"react": "^0.13.1",
|
||||||
"react-bootstrap": "^0.20.3",
|
"react-bootstrap": "^0.20.3",
|
||||||
"react-retina-image": "^1.1.2",
|
"react-retina-image": "^1.1.2",
|
||||||
"react-router": "^0.13.2",
|
"react-router": "^0.13.3",
|
||||||
"request": "^2.55.0",
|
"request": "^2.55.0",
|
||||||
"request-progress": "^0.3.1",
|
"request-progress": "^0.3.1",
|
||||||
"rimraf": "^2.3.2",
|
"rimraf": "^2.3.2",
|
||||||
|
@ -66,6 +66,7 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"babel": "^5.1.10",
|
"babel": "^5.1.10",
|
||||||
|
"babel-jest": "^5.2.0",
|
||||||
"gulp": "^3.8.11",
|
"gulp": "^3.8.11",
|
||||||
"gulp-babel": "^5.1.0",
|
"gulp-babel": "^5.1.0",
|
||||||
"gulp-changed": "^1.2.1",
|
"gulp-changed": "^1.2.1",
|
||||||
|
|
|
@ -93,8 +93,12 @@ var ContainerDetailsSubheader = React.createClass({
|
||||||
if (!this.disableTerminal()) {
|
if (!this.disableTerminal()) {
|
||||||
metrics.track('Terminaled Into Container');
|
metrics.track('Terminaled Into Container');
|
||||||
var container = this.props.container;
|
var container = this.props.container;
|
||||||
var shell = ContainerUtil.env(container).SHELL;
|
var shell = ContainerUtil.env(container).reduce((envs, env) => {
|
||||||
if(typeof shell === 'undefined') {
|
envs[env[0]] = env[1];
|
||||||
|
return envs;
|
||||||
|
}, {}).SHELL;
|
||||||
|
|
||||||
|
if(!shell) {
|
||||||
shell = 'sh';
|
shell = 'sh';
|
||||||
}
|
}
|
||||||
machine.ip().then(ip => {
|
machine.ip().then(ip => {
|
||||||
|
|
|
@ -54,7 +54,7 @@ var ContainerHome = React.createClass({
|
||||||
body = (
|
body = (
|
||||||
<div className="details-progress">
|
<div className="details-progress">
|
||||||
<h3>An error occurred:</h3>
|
<h3>An error occurred:</h3>
|
||||||
<h2>{this.props.container.Error.message}</h2>
|
<h2>{this.props.container.Error}</h2>
|
||||||
<h3>If you feel that this error is invalid, please <a onClick={this.handleErrorClick}>file a ticket on our GitHub repo.</a></h3>
|
<h3>If you feel that this error is invalid, please <a onClick={this.handleErrorClick}>file a ticket on our GitHub repo.</a></h3>
|
||||||
<Radial progress={100} error={true} thick={true} transparent={true}/>
|
<Radial progress={100} error={true} thick={true} transparent={true}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -25,7 +25,7 @@ var ContainerHomeFolder = React.createClass({
|
||||||
}, (index) => {
|
}, (index) => {
|
||||||
if (index === 0) {
|
if (index === 0) {
|
||||||
var volumes = _.clone(this.props.container.Volumes);
|
var volumes = _.clone(this.props.container.Volumes);
|
||||||
var newHostVolume = path.join(util.home(), 'Kitematic', this.props.container.Name, containerVolume);
|
var newHostVolume = path.join(util.home(), util.documents(), 'Kitematic', this.props.container.Name, containerVolume);
|
||||||
volumes[containerVolume] = newHostVolume;
|
volumes[containerVolume] = newHostVolume;
|
||||||
var binds = _.pairs(volumes).map(function (pair) {
|
var binds = _.pairs(volumes).map(function (pair) {
|
||||||
if(util.isWindows()) {
|
if(util.isWindows()) {
|
||||||
|
@ -63,7 +63,8 @@ var ContainerHomeFolder = React.createClass({
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var folders = _.map(this.props.container.Volumes, (val, key) => {
|
console.log(this.props.container.Volumes);
|
||||||
|
var folders = _.map(_.omit(this.props.container.Volumes, (v, k) => k.indexOf('/Users/') !== -1), (val, key) => {
|
||||||
var firstFolder = key;
|
var firstFolder = key;
|
||||||
return (
|
return (
|
||||||
<div key={key} className="folder" onClick={this.handleClickFolder.bind(this, val, key)}>
|
<div key={key} className="folder" onClick={this.handleClickFolder.bind(this, val, key)}>
|
||||||
|
|
|
@ -160,7 +160,7 @@ var Containers = React.createClass({
|
||||||
<section className={sidebarHeaderClass}>
|
<section className={sidebarHeaderClass}>
|
||||||
<h4>Containers</h4>
|
<h4>Containers</h4>
|
||||||
<div className="create">
|
<div className="create">
|
||||||
<Router.Link to="new">
|
<Router.Link tabIndex="-1" to="new">
|
||||||
<span className="btn btn-new btn-action has-icon btn-hollow"><span className="icon icon-add"></span>New</span>
|
<span className="btn btn-new btn-action has-icon btn-hollow"><span className="icon icon-add"></span>New</span>
|
||||||
</Router.Link>
|
</Router.Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
import './app';
|
|
@ -42,25 +42,30 @@ var MenuTemplate = function () {
|
||||||
click: function () {
|
click: function () {
|
||||||
metrics.track('Installed Docker Commands');
|
metrics.track('Installed Docker Commands');
|
||||||
if (!setupUtil.shouldUpdateBinaries()) {
|
if (!setupUtil.shouldUpdateBinaries()) {
|
||||||
|
dialog.showMessageBox({
|
||||||
|
message: 'Docker binaries are already installed in /usr/local/bin',
|
||||||
|
buttons: ['OK']
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let copy = setupUtil.needsBinaryFix() ?
|
let copy = setupUtil.needsBinaryFix() ?
|
||||||
util.exec(setupUtil.copyBinariesCmd() + ' && ' + setupUtil.fixBinariesCmd()) :
|
util.exec(setupUtil.macSudoCmd(setupUtil.copyBinariesCmd() + ' && ' + setupUtil.fixBinariesCmd())) :
|
||||||
util.exec(setupUtil.copyBinariesCmd());
|
util.exec(setupUtil.copyBinariesCmd());
|
||||||
|
|
||||||
copy.then(() => {
|
copy.then(() => {
|
||||||
dialog.showMessageBox({
|
dialog.showMessageBox({
|
||||||
message: 'Docker binaries have been copied to /usr/local/bin',
|
message: 'Docker binaries have been installed under /usr/local/bin',
|
||||||
buttons: ['OK']
|
buttons: ['OK']
|
||||||
});
|
});
|
||||||
}).catch(() => {});
|
}).catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'separator'
|
type: 'separator'
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
label: 'Hide Kitematic',
|
label: 'Hide Kitematic',
|
||||||
accelerator: util.CommandOrCtrl() + '+H',
|
accelerator: util.CommandOrCtrl() + '+H',
|
||||||
selector: 'hide:'
|
selector: 'hide:'
|
||||||
|
|
|
@ -41,7 +41,11 @@ var _steps = [{
|
||||||
yield virtualBox.killall();
|
yield virtualBox.killall();
|
||||||
progressCallback(50); // TODO: detect when the installation has started so we can simulate progress
|
progressCallback(50); // TODO: detect when the installation has started so we can simulate progress
|
||||||
try {
|
try {
|
||||||
yield util.exec(setupUtil.macSudoCmd(setupUtil.installVirtualBoxCmd()));
|
if (util.isWindows()) {
|
||||||
|
yield util.exec([path.join(util.supportDir(), virtualBox.filename())]);
|
||||||
|
} else {
|
||||||
|
yield util.exec(setupUtil.macSudoCmd(setupUtil.installVirtualBoxCmd()));
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
throw null;
|
throw null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,11 @@ var DockerMachine = {
|
||||||
},
|
},
|
||||||
create: function () {
|
create: function () {
|
||||||
var dockerversion = util.packagejson()['docker-version'];
|
var dockerversion = util.packagejson()['docker-version'];
|
||||||
return util.exec([this.command(), '-D', 'create', '-d', 'virtualbox', '--virtualbox-boot2docker-url', path.join(process.cwd(), 'resources', 'boot2docker-' + dockerversion + '.iso'), '--virtualbox-memory', '2048', NAME]);
|
if (util.isWindows()) {
|
||||||
|
return util.exec([this.command(), '-D', 'create', '-d', 'virtualbox', '--virtualbox-memory', '2048', NAME]);
|
||||||
|
} else {
|
||||||
|
return util.exec([this.command(), '-D', 'create', '-d', 'virtualbox', '--virtualbox-boot2docker-url', path.join(process.cwd(), 'resources', 'boot2docker-' + dockerversion + '.iso'), '--virtualbox-memory', '2048', NAME]);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
start: function () {
|
start: function () {
|
||||||
return util.exec([this.command(), '-D', 'start', NAME]);
|
return util.exec([this.command(), '-D', 'start', NAME]);
|
||||||
|
|
|
@ -103,6 +103,8 @@ export default {
|
||||||
containerData.Env = containerData.Config.Env;
|
containerData.Env = containerData.Config.Env;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
containerData.Volumes = _.mapObject(containerData.Volumes, () => {return {};});
|
||||||
|
|
||||||
let existing = this.client.getContainer(name);
|
let existing = this.client.getContainer(name);
|
||||||
existing.kill(() => {
|
existing.kill(() => {
|
||||||
existing.remove(() => {
|
existing.remove(() => {
|
||||||
|
@ -203,7 +205,6 @@ export default {
|
||||||
containerServerActions.error({name, error});
|
containerServerActions.error({name, error});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
existingData.name = existingData.Name || name;
|
|
||||||
|
|
||||||
if (existingData.Config && existingData.Config.Image) {
|
if (existingData.Config && existingData.Config.Image) {
|
||||||
existingData.Image = existingData.Config.Image;
|
existingData.Image = existingData.Config.Image;
|
||||||
|
|
|
@ -62,7 +62,7 @@ module.exports = {
|
||||||
let data = JSON.parse(body);
|
let data = JSON.parse(body);
|
||||||
|
|
||||||
// If the JWT has expired, then log in again to get a new JWT
|
// If the JWT has expired, then log in again to get a new JWT
|
||||||
if (data && data.detail === 'Signature has expired.') {
|
if (data && data.detail && data.detail.indexOf('expired') !== -1) {
|
||||||
let config = this.config();
|
let config = this.config();
|
||||||
if (!this.config()) {
|
if (!this.config()) {
|
||||||
this.logout();
|
this.logout();
|
||||||
|
|
|
@ -55,7 +55,7 @@ module.exports = {
|
||||||
recommended: function () {
|
recommended: function () {
|
||||||
request.get('https://kitematic.com/recommended.json', (error, response, body) => {
|
request.get('https://kitematic.com/recommended.json', (error, response, body) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
repositoryServerActions.recommendedError({error});
|
repositoryServerActions.error({error});
|
||||||
}
|
}
|
||||||
|
|
||||||
let data = JSON.parse(body);
|
let data = JSON.parse(body);
|
||||||
|
|
|
@ -3,6 +3,8 @@ var Promise = require('bluebird');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var crypto = require('crypto');
|
var crypto = require('crypto');
|
||||||
|
var remote = require('remote');
|
||||||
|
var app = remote.require('app');
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
exec: function (args, options) {
|
exec: function (args, options) {
|
||||||
|
@ -11,7 +13,7 @@ module.exports = {
|
||||||
exec(args, options, (stderr, stdout, code) => {
|
exec(args, options, (stderr, stdout, code) => {
|
||||||
if (code) {
|
if (code) {
|
||||||
var cmd = Array.isArray(args) ? args.join(' ') : args;
|
var cmd = Array.isArray(args) ? args.join(' ') : args;
|
||||||
reject(new Error(cmd + ' returned non zero exit code. Stderr: ' + stderr));
|
reject(new Error(cmd + ' returned non zero exit code.\n===== Stderr =====\n ' + stderr + '\n===== Stdout =====\n' + stdout));
|
||||||
} else {
|
} else {
|
||||||
resolve(stdout);
|
resolve(stdout);
|
||||||
}
|
}
|
||||||
|
@ -37,18 +39,13 @@ module.exports = {
|
||||||
return str.replace(/ /g, '\\ ').replace(/\(/g, '\\(').replace(/\)/g, '\\)');
|
return str.replace(/ /g, '\\ ').replace(/\(/g, '\\(').replace(/\)/g, '\\)');
|
||||||
},
|
},
|
||||||
home: function () {
|
home: function () {
|
||||||
return process.env[this.isWindows() ? 'USERPROFILE' : 'HOME'];
|
return app.getPath('home');
|
||||||
|
},
|
||||||
|
documents: function () {
|
||||||
|
return this.isWindows() ? 'My\ Documents' : 'Documents';
|
||||||
},
|
},
|
||||||
supportDir: function () {
|
supportDir: function () {
|
||||||
var dirs = ['Library', 'Application\ Support', 'Kitematic'];
|
return app.getPath('userData');
|
||||||
var acc = this.home();
|
|
||||||
dirs.forEach(function (d) {
|
|
||||||
acc = path.join(acc, d);
|
|
||||||
if (!fs.existsSync(acc)) {
|
|
||||||
fs.mkdirSync(acc);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return acc;
|
|
||||||
},
|
},
|
||||||
CommandOrCtrl: function () {
|
CommandOrCtrl: function () {
|
||||||
return this.isWindows() ? 'Ctrl' : 'Command';
|
return this.isWindows() ? 'Ctrl' : 'Command';
|
||||||
|
|
|
@ -17,11 +17,7 @@ var VirtualBox = {
|
||||||
return util.isWindows() ? util.packagejson()['virtualbox-checksum-win'] : util.packagejson()['virtualbox-checksum'];
|
return util.isWindows() ? util.packagejson()['virtualbox-checksum-win'] : util.packagejson()['virtualbox-checksum'];
|
||||||
},
|
},
|
||||||
url: function () {
|
url: function () {
|
||||||
if(util.isWindows()) {
|
return `https://github.com/kitematic/virtualbox/releases/download/${util.packagejson()['virtualbox-version']}/${this.filename()}`;
|
||||||
return 'http://download.virtualbox.org/virtualbox/4.3.26/VirtualBox-4.3.26-98988-Win.exe';
|
|
||||||
} else {
|
|
||||||
return `https://github.com/kitematic/virtualbox/releases/download/${util.packagejson()['virtualbox-version']}/${this.filename()}`;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
installed: function () {
|
installed: function () {
|
||||||
if(util.isWindows()) {
|
if(util.isWindows()) {
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
flex: 1;
|
flex: 1 auto;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
.header-section {
|
.header-section {
|
||||||
|
@ -43,7 +43,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.details-subheader {
|
.details-subheader {
|
||||||
//margin: 1rem 1rem 0 1rem;
|
|
||||||
flex: 0 auto;
|
flex: 0 auto;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -181,7 +180,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.details-panel {
|
.details-panel {
|
||||||
flex: 1;
|
flex: 1 auto;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
@color-box-button: lighten(@gray-lightest, 5%);
|
@color-box-button: lighten(@gray-lightest, 5%);
|
||||||
@color-background: lighten(@gray-lightest, 4.5%);
|
@color-background: lighten(@gray-lightest, 4.5%);
|
||||||
|
|
||||||
@font-regular: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
|
@font-regular: "Helvetica Neue", Segoe UI, Arial, "Lucida Grande", sans-serif;
|
||||||
@font-code: Menlo;
|
@font-code: Menlo, Consolas;
|
||||||
|
|
||||||
@border-radius: 0.2rem;
|
@border-radius: 0.2rem;
|
||||||
|
|
||||||
|
|
46
util/deps
46
util/deps
|
@ -1,46 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
||||||
BASE=$DIR/..
|
|
||||||
DOCKER_VERSION=$(node -pe "JSON.parse(process.argv[1])['docker-version']" "$(cat $BASE/package.json)")
|
|
||||||
DOCKER_MACHINE_VERSION=$(node -pe "JSON.parse(process.argv[1])['docker-machine-version']" "$(cat $BASE/package.json)")
|
|
||||||
DOCKER_COMPOSE_VERSION=$(node -pe "JSON.parse(process.argv[1])['docker-compose-version']" "$(cat $BASE/package.json)")
|
|
||||||
CURRENT_DOCKER_VERSION=$($BASE/resources/docker -v | cut -d ',' -f1 | awk '{print $3}' | cut -d '-' -f1)
|
|
||||||
CURRENT_DOCKER_MACHINE_VERSION=$($BASE/resources/docker-machine -v | cut -d ',' -f1 | awk '{print $3}' | cut -d '-' -f1)
|
|
||||||
CURRENT_DOCKER_COMPOSE_VERSION=$($BASE/resources/docker-compose --version | cut -d ',' -f1 | awk '{print $2}' | cut -d '-' -f1)
|
|
||||||
BOOT2DOCKER_FILE=boot2docker-$DOCKER_VERSION.iso
|
|
||||||
|
|
||||||
pushd $BASE/resources > /dev/null
|
|
||||||
|
|
||||||
if [ "$DOCKER_VERSION" != "$CURRENT_DOCKER_VERSION" ]; then
|
|
||||||
echo "-----> Downloading Docker CLI..."
|
|
||||||
rm -rf docker
|
|
||||||
rm -rf docker-*
|
|
||||||
curl -L -o docker-$DOCKER_VERSION.tgz https://get.docker.com/builds/Darwin/x86_64/docker-$DOCKER_VERSION.tgz
|
|
||||||
tar xvzf docker-$DOCKER_VERSION.tgz --strip=3
|
|
||||||
rm docker-$DOCKER_VERSION.tgz
|
|
||||||
chmod +x docker
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$DOCKER_MACHINE_VERSION" != "$CURRENT_DOCKER_MACHINE_VERSION" ]; then
|
|
||||||
echo "-----> Downloading Docker Machine CLI..."
|
|
||||||
rm -rf docker-machine
|
|
||||||
rm -rf docker-machine-*
|
|
||||||
curl -L -o docker-machine https://github.com/docker/machine/releases/download/v$DOCKER_MACHINE_VERSION/docker-machine_darwin-amd64
|
|
||||||
chmod +x docker-machine
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$DOCKER_COMPOSE_VERSION" != "$CURRENT_DOCKER_COMPOSE_VERSION" ]; then
|
|
||||||
echo "-----> Downloading Docker Compose CLI..."
|
|
||||||
rm -rf docker-compose
|
|
||||||
curl -L -o docker-compose https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-Darwin-x86_64
|
|
||||||
chmod +x docker-compose
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f $BOOT2DOCKER_FILE ]; then
|
|
||||||
echo "-----> Downloading Boot2Docker iso..."
|
|
||||||
rm -rf boot2docker-*
|
|
||||||
curl -L -o $BOOT2DOCKER_FILE https://github.com/boot2docker/boot2docker/releases/download/v$DOCKER_VERSION/boot2docker.iso
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
popd > /dev/null
|
|
|
@ -1,26 +0,0 @@
|
||||||
$scriptpath = $MyInvocation.MyCommand.Path
|
|
||||||
$dir = Split-Path $scriptpath
|
|
||||||
$BasePath = $dir + '\..\'
|
|
||||||
$packageJson = get-content ($BasePath + 'package.json')
|
|
||||||
[System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions") > $null
|
|
||||||
$serializer = New-Object System.Web.Script.Serialization.JavaScriptSerializer
|
|
||||||
$packageJsonContent = $serializer.DeserializeObject($packageJson)
|
|
||||||
$webclient = New-Object System.Net.WebClient
|
|
||||||
|
|
||||||
$DOCKER_MACHINE_CLI_VERSION = $packageJsonContent['docker-machine-version']
|
|
||||||
$DOCKER_CLI_VERSION = $packageJsonContent['docker-version']
|
|
||||||
|
|
||||||
|
|
||||||
if(-Not (test-path ($BasePath + '\resources\docker'))) {
|
|
||||||
echo "-----> Downloading Docker CLI..."
|
|
||||||
$source = "https://master.dockerproject.com/windows/amd64/docker.exe"
|
|
||||||
$destination = $BasePath + "\resources\docker"
|
|
||||||
$webclient.DownloadFile($source, $destination)
|
|
||||||
}
|
|
||||||
|
|
||||||
if(-Not (test-path ($BasePath + '\resources\docker-machine'))) {
|
|
||||||
echo "-----> Downloading Docker Machine CLI..."
|
|
||||||
$source = "https://github.com/docker/machine/releases/download/v" + $DOCKER_MACHINE_VERSION+ "/docker-machine_windows-amd64.exe"
|
|
||||||
$destination = $BasePath + "\resources\docker-machine"
|
|
||||||
$webclient.DownloadFile($source, $destination)
|
|
||||||
}
|
|
|
@ -1,14 +1 @@
|
||||||
require.requireActual('babel/polyfill');
|
require.requireActual('babel/polyfill');
|
||||||
require.requireActual('source-map-support').install({
|
|
||||||
retrieveSourceMap: function(filename) {
|
|
||||||
if (filename.indexOf('node_modules') === -1) {
|
|
||||||
try {
|
|
||||||
return {
|
|
||||||
map: require.requireActual('fs').readFileSync('/tmp/' + require('crypto').createHash('md5').update(filename).digest('hex') + '.map', 'utf8')
|
|
||||||
};
|
|
||||||
} catch (err) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
var babel = require('babel');
|
|
||||||
var fs = require('fs');
|
|
||||||
var crypto = require('crypto');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
process: function(src, filename) {
|
|
||||||
if (filename.indexOf('node_modules') !== -1) {
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
var compiled = babel.transform(src, {filename: filename, sourceMap: true});
|
|
||||||
fs.writeFileSync('/tmp/' + crypto.createHash('md5').update(filename).digest('hex') + '.map', JSON.stringify(compiled.map));
|
|
||||||
return compiled.code;
|
|
||||||
}
|
|
||||||
};
|
|
Loading…
Reference in New Issue