diff --git a/app/components/container/container.html b/app/components/container/container.html
index 083baf33c..2ec08ef6c 100644
--- a/app/components/container/container.html
+++ b/app/components/container/container.html
@@ -76,9 +76,43 @@
Environment: |
-
+
+
+
+
|
@@ -104,11 +138,42 @@
Ports: |
-
- -
- {{ containerport }} => {{ v.HostIp }}:{{ v.HostPort }}
+
+
+
+ -
+ {{ containerport }} =>
+ {{ v.HostIp }}:{{ v.HostPort }}
+
+
+
+
+
+
+
+
+
|
@@ -130,6 +195,44 @@
{{ container.Config.Entrypoint.join(' ') }}
+
+ Bindings: |
+
+
+
+
+
+
+
+
+ |
+
Volumes: |
{{ container.Volumes }} |
diff --git a/app/components/container/containerController.js b/app/components/container/containerController.js
index b384b6a3f..8e485ca0b 100644
--- a/app/components/container/containerController.js
+++ b/app/components/container/containerController.js
@@ -1,8 +1,14 @@
-angular.module('container', [])
- .controller('ContainerController', ['$scope', '$routeParams', '$location', 'Container', 'ContainerCommit', 'Messages', 'ViewSpinner', '$timeout',
- function ($scope, $routeParams, $location, Container, ContainerCommit, Messages, ViewSpinner, $timeout) {
+ angular.module('container', [])
+ .controller('ContainerController', ['$scope', '$routeParams', '$location', 'Container', 'ContainerCommit', 'Image', 'Messages', 'ViewSpinner', '$timeout',
+ function ($scope, $routeParams, $location, Container, ContainerCommit, Image, Messages, ViewSpinner, $timeout) {
$scope.changes = [];
- $scope.edit = false;
+ $scope.editEnv = false;
+ $scope.editPorts = false;
+ $scope.editBinds = false;
+ $scope.newCfg = {
+ Env: [],
+ Ports: {}
+ };
var update = function () {
ViewSpinner.spin();
@@ -10,6 +16,49 @@ angular.module('container', [])
$scope.container = d;
$scope.container.edit = false;
$scope.container.newContainerName = d.Name;
+
+ // fill up env
+ if (d.Config.Env) {
+ $scope.newCfg.Env = d.Config.Env.map(function (entry) {
+ return {name: entry.split('=')[0], value: entry.split('=')[1]};
+ });
+ }
+
+ // fill up ports
+ $scope.newCfg.Ports = {};
+ angular.forEach(d.Config.ExposedPorts, function(i, port) {
+ if (d.HostConfig.PortBindings && port in d.HostConfig.PortBindings)
+ $scope.newCfg.Ports[port] = d.HostConfig.PortBindings[port];
+ else
+ $scope.newCfg.Ports[port] = [];
+ });
+
+ // fill up bindings
+ $scope.newCfg.Binds = [];
+ var defaultBinds = {};
+ angular.forEach(d.Config.Volumes, function(value, vol) {
+ defaultBinds[vol] = { ContPath: vol, HostPath: '', ReadOnly: false, DefaultBind: true };
+ });
+ angular.forEach(d.HostConfig.Binds, function(binding, i) {
+ var mountpoint = binding.split(':')[0];
+ var vol = binding.split(':')[1] || '';
+ var ro = binding.split(':').length > 2 && binding.split(':')[2] == 'ro';
+ var defaultBind = false;
+ if (vol == '') {
+ vol = mountpoint;
+ mountpoint = '';
+ }
+
+ if (vol in defaultBinds) {
+ delete defaultBinds[vol];
+ defaultBind = true;
+ }
+ $scope.newCfg.Binds.push({ ContPath: vol, HostPath: mountpoint, ReadOnly: ro, DefaultBind: defaultBind });
+ });
+ angular.forEach(defaultBinds, function(bind) {
+ $scope.newCfg.Binds.push(bind);
+ });
+
ViewSpinner.stop();
}, function (e) {
if (e.status === 404) {
@@ -20,6 +69,7 @@ angular.module('container', [])
}
ViewSpinner.stop();
});
+
};
$scope.start = function () {
@@ -58,6 +108,108 @@ angular.module('container', [])
});
};
+ $scope.restartEnv = function () {
+ var config = angular.copy($scope.container.Config);
+
+ config.Env = $scope.newCfg.Env.map(function(entry) {
+ return entry.name+"="+entry.value;
+ });
+
+ var portBindings = angular.copy($scope.newCfg.Ports);
+ angular.forEach(portBindings, function(item, key) {
+ if (item.length == 0)
+ delete portBindings[key];
+ });
+
+
+ var binds = [];
+ angular.forEach($scope.newCfg.Binds, function(b) {
+ if (b.ContPath != '') {
+ var bindLine = '';
+ if (b.HostPath != '') {
+ bindLine = b.HostPath + ':';
+ }
+ bindLine += b.ContPath;
+ if (b.ReadOnly) {
+ bindLine += ':ro';
+ }
+ if (b.HostPath != '' || !b.DefaultBind) {
+ binds.push(bindLine);
+ }
+ }
+ });
+
+
+ ViewSpinner.spin();
+ ContainerCommit.commit({id: $routeParams.id, tag: $scope.container.Config.Image, config: config }, function (d) {
+ if ('Id' in d) {
+ var imageId = d.Id;
+ Image.inspect({id: imageId}, function(imageData) {
+ // Append current host config to image with new port bindings
+ imageData.Config.HostConfig = angular.copy($scope.container.HostConfig);
+ imageData.Config.HostConfig.PortBindings = portBindings;
+ imageData.Config.HostConfig.Binds = binds;
+ if (imageData.Config.HostConfig.NetworkMode == 'host') {
+ imageData.Config.Hostname = '';
+ }
+
+ Container.create(imageData.Config, function(containerData) {
+ if (!('Id' in containerData)) {
+ Messages.error("Failure", "Container failed to create.");
+ return;
+ }
+ // Stop current if running
+ if ($scope.container.State.Running) {
+ Container.stop({id: $routeParams.id}, function (d) {
+ Messages.send("Container stopped", $routeParams.id);
+ // start new
+ Container.start({
+ id: containerData.Id
+ }, function (d) {
+ $location.url('/containers/' + containerData.Id + '/');
+ Messages.send("Container started", $routeParams.id);
+ }, function (e) {
+ update();
+ Messages.error("Failure", "Container failed to start." + e.data);
+ });
+ }, function (e) {
+ update();
+ Messages.error("Failure", "Container failed to stop." + e.data);
+ });
+ } else {
+ // start new
+ Container.start({
+ id: containerData.Id
+ }, function (d) {
+ $location.url('/containers/'+containerData.Id+'/');
+ Messages.send("Container started", $routeParams.id);
+ }, function (e) {
+ update();
+ Messages.error("Failure", "Container failed to start." + e.data);
+ });
+ }
+
+ }, function(e) {
+ update();
+ Messages.error("Failure", "Image failed to get." + e.data);
+ });
+ }, function (e) {
+ update();
+ Messages.error("Failure", "Image failed to get." + e.data);
+ })
+
+ } else {
+ update();
+ Messages.error("Failure", "Container commit failed.");
+ }
+
+
+ }, function (e) {
+ update();
+ Messages.error("Failure", "Container failed to commit." + e.data);
+ });
+ };
+
$scope.commit = function () {
ViewSpinner.spin();
ContainerCommit.commit({id: $routeParams.id, repo: $scope.container.Config.Image}, function (d) {
@@ -139,6 +291,19 @@ angular.module('container', [])
$scope.container.edit = false;
};
+ $scope.addEntry = function (array, entry) {
+ array.push(entry);
+ };
+ $scope.rmEntry = function (array, entry) {
+ var idx = array.indexOf(entry);
+ array.splice(idx, 1);
+ };
+
+ $scope.toggleEdit = function() {
+ $scope.edit = !$scope.edit;
+ };
+
update();
$scope.getChanges();
}]);
+
diff --git a/app/shared/services.js b/app/shared/services.js
index 2f9530d73..d2f1babf8 100644
--- a/app/shared/services.js
+++ b/app/shared/services.js
@@ -31,8 +31,10 @@ angular.module('dockerui.services', ['ngResource'])
url: Settings.url + '/commit',
params: {
'container': params.id,
- 'repo': params.repo
- }
+ 'tag': params.tag || null,
+ 'repo': params.repo || null
+ },
+ data: params.config
}).success(callback).error(function (data, status, headers, config) {
console.log(error, data);
});
@@ -92,7 +94,8 @@ angular.module('dockerui.services', ['ngResource'])
insert: {method: 'POST', params: {id: '@id', action: 'insert'}},
push: {method: 'POST', params: {id: '@id', action: 'push'}},
tag: {method: 'POST', params: {id: '@id', action: 'tag', force: 0, repo: '@repo', tag: '@tag'}},
- remove: {method: 'DELETE', params: {id: '@id'}, isArray: true}
+ remove: {method: 'DELETE', params: {id: '@id'}, isArray: true},
+ inspect: {method: 'GET', params: {id: '@id', action: 'json'}}
});
}])
.factory('Version', ['$resource', 'Settings', function VersionFactory($resource, Settings) {