diff --git a/src/ContainerHomeFolders.react.js b/src/ContainerHomeFolders.react.js index 513cc974b5..1ace6d4e90 100644 --- a/src/ContainerHomeFolders.react.js +++ b/src/ContainerHomeFolders.react.js @@ -2,19 +2,38 @@ var _ = require('underscore'); var React = require('react/addons'); var RetinaImage = require('react-retina-image'); var path = require('path'); -var exec = require('exec'); +var shell = require('shell'); +var util = require('./Util'); var metrics = require('./Metrics'); var Router = require('react-router'); +var ContainerStore = require('./ContainerStore'); var ContainerHomeFolder = React.createClass({ mixins: [Router.State, Router.Navigation], - handleClickFolder: function (path) { + handleClickFolder: function (hostVolume, containerVolume) { metrics.track('Opened Volume Directory', { from: 'home' }); - exec(['open', path], function (err) { - if (err) { throw err; } - }); + + if (hostVolume.indexOf(process.env.HOME) === -1) { + var volumes = _.clone(this.props.container.Volumes); + var newHostVolume = path.join(util.home(), 'Kitematic', this.props.container.Name, containerVolume); + volumes[containerVolume] = newHostVolume; + var binds = _.pairs(volumes).map(function (pair) { + return pair[1] + ':' + pair[0]; + }); + ContainerStore.updateContainer(this.props.container.Name, { + Binds: binds + }, function (err) { + if (err) { + console.log(err); + return; + } + shell.showItemInFolder(newHostVolume); + }); + } else { + shell.showItemInFolder(hostVolume); + } }, handleClickChangeFolders: function () { metrics.track('Viewed Volume Settings', { @@ -23,24 +42,21 @@ var ContainerHomeFolder = React.createClass({ this.transitionTo('containerSettingsVolumes', {name: this.getParams().name}); }, render: function () { - var folders; - if (this.props.container) { - var self = this; - folders = _.map(self.props.container.Volumes, function (val, key) { - var firstFolder = key.split(path.sep)[1]; - if (!val || val.indexOf(process.env.HOME) === -1) { - return; - } else { - return ( -
- -
{firstFolder}
-
- ); - } - }); + if (!this.props.container) { + return false; } - if (this.props.container && this.props.container.Volumes && _.keys(this.props.container.Volumes).length > 0 && this.props.container.State.Running) { + + var folders = _.map(this.props.container.Volumes, (val, key) => { + var firstFolder = key.split(path.sep)[1]; + return ( +
+ +
{firstFolder}
+
+ ); + }); + + if (this.props.container.Volumes && _.keys(this.props.container.Volumes).length > 0 && this.props.container.State.Running) { return (

Edit Files

@@ -51,9 +67,7 @@ var ContainerHomeFolder = React.createClass({
); } else { - return ( -
- ); + return false; } } }); diff --git a/src/ContainerSettingsVolumes.react.js b/src/ContainerSettingsVolumes.react.js index 32e699449e..cb470e75aa 100644 --- a/src/ContainerSettingsVolumes.react.js +++ b/src/ContainerSettingsVolumes.react.js @@ -31,6 +31,21 @@ var ContainerSettingsVolumes = React.createClass({ } }); }, + handleRemoveVolumeClick: function (dockerVol) { + metrics.track('Removed Volume Directory', { + from: 'settings' + }); + var volumes = _.clone(this.props.container.Volumes); + delete volumes[dockerVol]; + var binds = _.pairs(volumes).map(function (pair) { + return pair[1] + ':' + pair[0]; + }); + ContainerStore.updateContainer(this.props.container.Name, { + Binds: binds + }, function (err) { + if (err) { console.log(err); } + }); + }, handleOpenVolumeClick: function (path) { metrics.track('Opened Volume Directory', { from: 'settings' @@ -50,6 +65,7 @@ var ContainerSettingsVolumes = React.createClass({ No Folder Change + Remove ); } else { @@ -57,6 +73,7 @@ var ContainerSettingsVolumes = React.createClass({ {val.replace(process.env.HOME, '~')} Change + Remove ); } diff --git a/src/ContainerStore.js b/src/ContainerStore.js index 121033316f..cb394f1593 100644 --- a/src/ContainerStore.js +++ b/src/ContainerStore.js @@ -1,14 +1,12 @@ var _ = require('underscore'); var EventEmitter = require('events').EventEmitter; var async = require('async'); -var path = require('path'); var assign = require('object-assign'); var docker = require('./Docker'); var metrics = require('./Metrics'); var registry = require('./Registry'); var logstore = require('./LogStore'); var bugsnag = require('bugsnag-js'); -var util = require('./Util'); var _placeholders = {}; var _containers = {}; @@ -92,38 +90,22 @@ var ContainerStore = assign(Object.create(EventEmitter.prototype), { }, _startContainer: function (name, containerData, callback) { var self = this; - docker.client().getImage(containerData.Image).inspect(function (err, data) { + var binds = containerData.Binds || []; + var startopts = { + Binds: binds + }; + if (containerData.NetworkSettings && containerData.NetworkSettings.Ports) { + startopts.PortBindings = containerData.NetworkSettings.Ports; + } else{ + startopts.PublishAllPorts = true; + } + var container = docker.client().getContainer(name); + container.start(startopts, function (err) { if (err) { callback(err); return; } - var binds = containerData.Binds || []; - if (data.Config.Volumes) { - _.each(data.Config.Volumes, function (value, key) { - var existingBind = _.find(binds, b => { - return b.indexOf(':' + key) !== -1; - }); - if (!existingBind) { - binds.push(path.join(util.home(), 'Kitematic', name, key)+ ':' + key); - } - }); - } - var startopts = { - Binds: binds - }; - if (containerData.NetworkSettings && containerData.NetworkSettings.Ports) { - startopts.PortBindings = containerData.NetworkSettings.Ports; - } else{ - startopts.PublishAllPorts = true; - } - var container = docker.client().getContainer(name); - container.start(startopts, function (err) { - if (err) { - callback(err); - return; - } - self.fetchContainer(name, callback); - }); + self.fetchContainer(name, callback); }); }, _createContainer: function (name, containerData, callback) { @@ -137,6 +119,9 @@ var ContainerStore = assign(Object.create(EventEmitter.prototype), { if (containerData.Config && containerData.Config.Image) { containerData.Image = containerData.Config.Image; } + if (containerData.Config && containerData.Config.Env) { + containerData.Env = containerData.Config.Env; + } existing.kill(function () { existing.remove(function () { docker.client().createContainer(containerData, function (err) { @@ -144,11 +129,7 @@ var ContainerStore = assign(Object.create(EventEmitter.prototype), { callback(err, null); return; } - if (containerData.State && !containerData.State.Running) { - self.fetchContainer(containerData.name, callback); - } else { - self._startContainer(name, containerData, callback); - } + self._startContainer(name, containerData, callback); }); }); });