diff --git a/app/azure/views/containerinstances/container-instance-details/containerInstanceDetailsController.js b/app/azure/views/containerinstances/container-instance-details/containerInstanceDetailsController.js
index c723a8b88..769fea6ff 100644
--- a/app/azure/views/containerinstances/container-instance-details/containerInstanceDetailsController.js
+++ b/app/azure/views/containerinstances/container-instance-details/containerInstanceDetailsController.js
@@ -21,7 +21,7 @@ class ContainerInstanceDetailsController {
this.container = await this.ContainerGroupService.containerGroup(subscriptionId, resourceGroupId, containerGroupId);
this.resourceGroup = await this.ResourceGroupService.resourceGroup(subscriptionId, resourceGroupId);
} catch (err) {
- this.Notifications.error('Failure', err, 'Unable to retrive container instance details');
+ this.Notifications.error('Failure', err, 'Unable to retrieve container instance details');
}
this.state.loading = false;
}
diff --git a/app/docker/components/imageRegistry/por-image-registry.controller.js b/app/docker/components/imageRegistry/por-image-registry.controller.js
index 5cf3fc709..055249917 100644
--- a/app/docker/components/imageRegistry/por-image-registry.controller.js
+++ b/app/docker/components/imageRegistry/por-image-registry.controller.js
@@ -15,12 +15,14 @@ class porImageRegistryController {
this.Notifications = Notifications;
this.onRegistryChange = this.onRegistryChange.bind(this);
+ this.onImageChange = this.onImageChange.bind(this);
this.registries = [];
this.images = [];
this.defaultRegistry = new DockerHubViewModel();
this.$scope.$watch(() => this.model.Registry, this.onRegistryChange);
+ this.$scope.$watch(() => this.model.Image, this.onImageChange);
}
isKnownRegistry(registry) {
@@ -62,6 +64,12 @@ class porImageRegistryController {
}
}
+ async onImageChange() {
+ if (!this.isDockerHubRegistry()) {
+ this.setValidity(true);
+ }
+ }
+
displayedRegistryURL() {
return this.getRegistryURL(this.model.Registry) || 'docker.io';
}
diff --git a/app/docker/components/imageRegistry/por-image-registry.html b/app/docker/components/imageRegistry/por-image-registry.html
index 375582a66..6fbcd0e21 100644
--- a/app/docker/components/imageRegistry/por-image-registry.html
+++ b/app/docker/components/imageRegistry/por-image-registry.html
@@ -24,7 +24,7 @@
uib-typeahead="image for image in $ctrl.availableImages | filter:$viewValue | limitTo:5"
ng-model="$ctrl.model.Image"
name="image_name"
- placeholder="e.g. myImage:myTag"
+ placeholder="e.g. my-image:my-tag"
ng-change="$ctrl.onImageChange()"
required
data-cy="component-imageInput"
@@ -54,7 +54,7 @@
-
+
diff --git a/app/docker/views/containers/create/createContainerController.js b/app/docker/views/containers/create/createContainerController.js
index 8b7c062d6..0ef8ce3d7 100644
--- a/app/docker/views/containers/create/createContainerController.js
+++ b/app/docker/views/containers/create/createContainerController.js
@@ -580,7 +580,7 @@ angular.module('portainer.docker').controller('CreateContainerController', [
$scope.formValues.RegistryModel = model;
})
.catch(function error(err) {
- Notifications.error('Failure', err, 'Unable to retrive registry');
+ Notifications.error('Failure', err, 'Unable to retrieve registry');
});
}
diff --git a/app/docker/views/images/build/buildimage.html b/app/docker/views/images/build/buildimage.html
index 06d0dc735..96577d004 100644
--- a/app/docker/views/images/build/buildimage.html
+++ b/app/docker/views/images/build/buildimage.html
@@ -49,7 +49,7 @@
name
-
+
diff --git a/app/docker/views/services/edit/serviceController.js b/app/docker/views/services/edit/serviceController.js
index 2bb27171a..717ee0218 100644
--- a/app/docker/views/services/edit/serviceController.js
+++ b/app/docker/views/services/edit/serviceController.js
@@ -53,6 +53,7 @@ angular.module('portainer.docker').controller('ServiceController', [
'clipboard',
'WebhookHelper',
'NetworkService',
+ 'RegistryService',
'endpoint',
function (
$q,
@@ -84,6 +85,7 @@ angular.module('portainer.docker').controller('ServiceController', [
clipboard,
WebhookHelper,
NetworkService,
+ RegistryService,
endpoint
) {
$scope.endpoint = endpoint;
@@ -353,22 +355,22 @@ angular.module('portainer.docker').controller('ServiceController', [
$('#copyNotification').fadeOut(2000);
};
- $scope.cancelChanges = function cancelChanges(service, keys) {
+ $scope.cancelChanges = async function cancelChanges(service, keys) {
if (keys) {
// clean out the keys only from the list of modified keys
- keys.forEach(function (key) {
+ for (const key of keys) {
if (key === 'Image') {
- $scope.formValues.RegistryModel.Image = '';
+ $scope.formValues.RegistryModel = await RegistryService.retrievePorRegistryModelFromRepository(originalService.Image, endpoint.Id);
} else {
var index = previousServiceValues.indexOf(key);
if (index >= 0) {
previousServiceValues.splice(index, 1);
}
}
- });
+ }
} else {
// clean out all changes
- $scope.formValues.RegistryModel.Image = '';
+ $scope.formValues.RegistryModel = await RegistryService.retrievePorRegistryModelFromRepository(originalService.Image, endpoint.Id);
keys = Object.keys(service);
previousServiceValues = [];
}
@@ -382,7 +384,9 @@ angular.module('portainer.docker').controller('ServiceController', [
var hasChanges = false;
elements.forEach(function (key) {
if (key === 'Image') {
- hasChanges = hasChanges || $scope.formValues.RegistryModel.Image ? true : false;
+ const originalImage = service ? service.Model.Spec.TaskTemplate.ContainerSpec.Image : null;
+ const currentImage = ImageHelper.createImageConfigForContainer($scope.formValues.RegistryModel).fromImage;
+ hasChanges = hasChanges || originalImage !== currentImage;
} else {
hasChanges = hasChanges || previousServiceValues.indexOf(key) >= 0;
}
@@ -763,6 +767,11 @@ angular.module('portainer.docker').controller('ServiceController', [
$scope.state.sliderMaxCpu = 32;
}
+ const image = $scope.service.Model.Spec.TaskTemplate.ContainerSpec.Image;
+ RegistryService.retrievePorRegistryModelFromRepository(image, endpoint.Id).then((model) => {
+ $scope.formValues.RegistryModel = model;
+ });
+
// Default values
$scope.state.addSecret = { override: false };
diff --git a/app/portainer/services/api/resourceControlService.js b/app/portainer/services/api/resourceControlService.js
index 55e2d58fa..d39820e0a 100644
--- a/app/portainer/services/api/resourceControlService.js
+++ b/app/portainer/services/api/resourceControlService.js
@@ -103,7 +103,7 @@ angular.module('portainer.app').factory('ResourceControlService', [
}
/**
- * Retrive users and team details for ResourceControlViewModel
+ * Retrieve users and team details for ResourceControlViewModel
* @param {ResourceControlViewModel} resourceControl ResourceControl view model
*/
function retrieveOwnershipDetails(resourceControl) {