diff --git a/app/docker/components/imageRegistry/porImageRegistryController.js b/app/docker/components/imageRegistry/porImageRegistryController.js index 721d61afe..06b10c0b9 100644 --- a/app/docker/components/imageRegistry/porImageRegistryController.js +++ b/app/docker/components/imageRegistry/porImageRegistryController.js @@ -15,9 +15,11 @@ class porImageRegistryController { async onInit() { try { - const [registries, dockerhub, availableImages] = await Promise.all([this.RegistryService.registries(), - this.DockerHubService.dockerhub(), - this.autoComplete ? this.ImageService.images() : []]); + const [registries, dockerhub, availableImages] = await Promise.all([ + this.RegistryService.registries(), + this.DockerHubService.dockerhub(), + this.autoComplete ? this.ImageService.images() : [] + ]); this.availableImages = this.ImageService.getUniqueTagListFromImages(availableImages); this.availableRegistries = [dockerhub].concat(registries); diff --git a/app/docker/services/imageService.js b/app/docker/services/imageService.js index fbab095f2..ae818c710 100644 --- a/app/docker/services/imageService.js +++ b/app/docker/services/imageService.js @@ -135,8 +135,6 @@ angular.module('portainer.docker') * @param {bool} ignoreErrors */ function pullImage(registry, ignoreErrors) { - // var imageDetails = ImageHelper.extractImageAndRegistryFromRepository(image); - // var imageConfiguration = ImageHelper.createImageConfigForContainer(imageDetails.image, registry.URL); var authenticationDetails = registry.Registry.Authentication ? RegistryService.encodedCredentials(registry.Registry) : ''; HttpRequestHelper.setRegistryAuthenticationHeader(authenticationDetails); diff --git a/app/docker/views/containers/create/createContainerController.js b/app/docker/views/containers/create/createContainerController.js index 5f52657eb..ce5719b1a 100644 --- a/app/docker/views/containers/create/createContainerController.js +++ b/app/docker/views/containers/create/createContainerController.js @@ -131,7 +131,6 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container $scope.fromContainerMultipleNetworks = false; - // TODO function prepareImageConfig(config) { const imageConfig = ImageHelper.createImageConfigForContainer($scope.formValues.RegistryModel); config.Image = imageConfig.fromImage; @@ -436,15 +435,10 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container $scope.config.HostConfig.Devices = path; } - // TODO function loadFromContainerImageConfig() { - var imageInfo = ImageHelper.extractImageAndRegistryFromRepository($scope.config.Image); - RegistryService.retrieveRegistryFromRepository($scope.config.Image) - .then(function success(data) { - if (data) { - $scope.config.Image = imageInfo.image; - $scope.formValues.RegistryModel = data; - } + RegistryService.retrievePorRegistryModelFromRepository($scope.config.Image) + .then((model) => { + $scope.formValues.RegistryModel = model; }) .catch(function error(err) { Notifications.error('Failure', err, 'Unable to retrive registry'); diff --git a/app/docker/views/containers/create/createcontainer.html b/app/docker/views/containers/create/createcontainer.html index cec1a551e..ec3e77e14 100644 --- a/app/docker/views/containers/create/createcontainer.html +++ b/app/docker/views/containers/create/createcontainer.html @@ -33,6 +33,16 @@ auto-complete="true" label-class="col-sm-1" input-class="col-sm-11 col-md-5" > +
+
+ Note: if you don't specify the tag in the image name, latest will be used. +
+
+
+
+ WARNING: if you don't specify the tag in the image name, all tags will be pulled for the image unless you don't ask Portainer to pull the image. +
+
diff --git a/app/portainer/helpers/registryHelper.js b/app/portainer/helpers/registryHelper.js deleted file mode 100644 index bef569f6d..000000000 --- a/app/portainer/helpers/registryHelper.js +++ /dev/null @@ -1,18 +0,0 @@ -angular.module('portainer.app') -.factory('RegistryHelper', [function RegistryHelperFactory() { - 'use strict'; - - var helper = {}; - - helper.getRegistryByURL = function(registries, url) { - for (var i = 0; i < registries.length; i++) { - if (registries[i].URL === url) { - return registries[i]; - } - } - - return null; - }; - - return helper; -}]); diff --git a/app/portainer/services/api/registryService.js b/app/portainer/services/api/registryService.js index fa97e9279..cdcdeefef 100644 --- a/app/portainer/services/api/registryService.js +++ b/app/portainer/services/api/registryService.js @@ -1,8 +1,10 @@ import _ from 'lodash-es'; import { RegistryViewModel, RegistryCreateRequest } from '../../models/registry'; +import { PorImageRegistryModel } from 'Docker/models/porImageRegistry'; angular.module('portainer.app') -.factory('RegistryService', ['$q', 'Registries', 'DockerHubService', 'RegistryHelper', 'ImageHelper', 'FileUploadService', function RegistryServiceFactory($q, Registries, DockerHubService, RegistryHelper, ImageHelper, FileUploadService) { +.factory('RegistryService', ['$q', '$async', 'Registries', 'DockerHubService', 'ImageHelper', 'FileUploadService', +function RegistryServiceFactory($q, $async, Registries, DockerHubService, ImageHelper, FileUploadService) { 'use strict'; var service = {}; @@ -79,25 +81,35 @@ angular.module('portainer.app') return $q.all(promises); }; - service.retrieveRegistryFromRepository = function(repository) { - var deferred = $q.defer(); - console.log('registry', repository); - - var imageDetails = ImageHelper.extractImageAndRegistryFromRepository(repository); - $q.when(imageDetails.registry ? service.registries() : DockerHubService.dockerhub()) - .then(function success(data) { - var registry = data; - if (imageDetails.registry) { - registry = RegistryHelper.getRegistryByURL(data, imageDetails.registry); + async function retrievePorRegistryModelFromRepositoryAsync(repository) { + try { + const model = new PorImageRegistryModel(); + const [registries, dockerhub] = await Promise.all([ + service.registries(), + DockerHubService.dockerhub() + ]); + registries.concat([dockerhub]); + const registry = _.find(registries, (reg) => _.includes(repository, reg.URL)); + if (registry) { + const lastIndex = repository.lastIndexOf(registry.URL) + registry.URL.length; + const image = repository.substring(lastIndex + 1); + model.Registry = registry; + model.Image = image; + } else { + model.UseRegistry = false; + model.Image = repository; } - deferred.resolve(registry); - }) - .catch(function error(err) { - deferred.reject({ msg: 'Unable to retrieve the registry associated to the repository', err: err }); - }); + return model; + } catch (err) { + throw { msg: 'Unable to retrieve the registry associated to the repository', err: err } + } + } - return deferred.promise; + service.retrievePorRegistryModelFromRepository = function(repository) { + return $async(retrievePorRegistryModelFromRepositoryAsync, repository) }; return service; }]); + +// retrieveRegistryFromRepository \ No newline at end of file