mirror of
https://github.com/portainer/portainer.git
synced 2025-08-04 13:25:26 +02:00
feat(app): push pull container duplicate
This commit is contained in:
parent
fd3187abc8
commit
c183cb53aa
6 changed files with 47 additions and 49 deletions
|
@ -15,9 +15,11 @@ class porImageRegistryController {
|
||||||
|
|
||||||
async onInit() {
|
async onInit() {
|
||||||
try {
|
try {
|
||||||
const [registries, dockerhub, availableImages] = await Promise.all([this.RegistryService.registries(),
|
const [registries, dockerhub, availableImages] = await Promise.all([
|
||||||
|
this.RegistryService.registries(),
|
||||||
this.DockerHubService.dockerhub(),
|
this.DockerHubService.dockerhub(),
|
||||||
this.autoComplete ? this.ImageService.images() : []]);
|
this.autoComplete ? this.ImageService.images() : []
|
||||||
|
]);
|
||||||
this.availableImages = this.ImageService.getUniqueTagListFromImages(availableImages);
|
this.availableImages = this.ImageService.getUniqueTagListFromImages(availableImages);
|
||||||
this.availableRegistries = [dockerhub].concat(registries);
|
this.availableRegistries = [dockerhub].concat(registries);
|
||||||
|
|
||||||
|
|
|
@ -135,8 +135,6 @@ angular.module('portainer.docker')
|
||||||
* @param {bool} ignoreErrors
|
* @param {bool} ignoreErrors
|
||||||
*/
|
*/
|
||||||
function pullImage(registry, 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) : '';
|
var authenticationDetails = registry.Registry.Authentication ? RegistryService.encodedCredentials(registry.Registry) : '';
|
||||||
HttpRequestHelper.setRegistryAuthenticationHeader(authenticationDetails);
|
HttpRequestHelper.setRegistryAuthenticationHeader(authenticationDetails);
|
||||||
|
|
||||||
|
|
|
@ -131,7 +131,6 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container
|
||||||
|
|
||||||
$scope.fromContainerMultipleNetworks = false;
|
$scope.fromContainerMultipleNetworks = false;
|
||||||
|
|
||||||
// TODO
|
|
||||||
function prepareImageConfig(config) {
|
function prepareImageConfig(config) {
|
||||||
const imageConfig = ImageHelper.createImageConfigForContainer($scope.formValues.RegistryModel);
|
const imageConfig = ImageHelper.createImageConfigForContainer($scope.formValues.RegistryModel);
|
||||||
config.Image = imageConfig.fromImage;
|
config.Image = imageConfig.fromImage;
|
||||||
|
@ -436,15 +435,10 @@ function ($q, $scope, $async, $state, $timeout, $transition$, $filter, Container
|
||||||
$scope.config.HostConfig.Devices = path;
|
$scope.config.HostConfig.Devices = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO
|
|
||||||
function loadFromContainerImageConfig() {
|
function loadFromContainerImageConfig() {
|
||||||
var imageInfo = ImageHelper.extractImageAndRegistryFromRepository($scope.config.Image);
|
RegistryService.retrievePorRegistryModelFromRepository($scope.config.Image)
|
||||||
RegistryService.retrieveRegistryFromRepository($scope.config.Image)
|
.then((model) => {
|
||||||
.then(function success(data) {
|
$scope.formValues.RegistryModel = model;
|
||||||
if (data) {
|
|
||||||
$scope.config.Image = imageInfo.image;
|
|
||||||
$scope.formValues.RegistryModel = data;
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.catch(function error(err) {
|
.catch(function error(err) {
|
||||||
Notifications.error('Failure', err, 'Unable to retrive registry');
|
Notifications.error('Failure', err, 'Unable to retrive registry');
|
||||||
|
|
|
@ -33,6 +33,16 @@
|
||||||
auto-complete="true"
|
auto-complete="true"
|
||||||
label-class="col-sm-1" input-class="col-sm-11 col-md-5"
|
label-class="col-sm-1" input-class="col-sm-11 col-md-5"
|
||||||
></por-image-registry>
|
></por-image-registry>
|
||||||
|
<div class="form-group" ng-if="formValues.RegistryModel.UseRegistry">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<span class="small text-muted">Note: if you don't specify the tag in the image name, <span class="label label-default">latest</span> will be used.</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group" ng-if="formValues.alwaysPull && !formValues.RegistryModel.UseRegistry">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<span class="small text-muted"><i class="fa fa-exclamation-circle orange-icon" aria-hidden="true" style="margin-right: 2px;"></i> 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.</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<!-- !image-and-registry -->
|
<!-- !image-and-registry -->
|
||||||
<!-- always-pull -->
|
<!-- always-pull -->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
|
@ -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;
|
|
||||||
}]);
|
|
|
@ -1,8 +1,10 @@
|
||||||
import _ from 'lodash-es';
|
import _ from 'lodash-es';
|
||||||
import { RegistryViewModel, RegistryCreateRequest } from '../../models/registry';
|
import { RegistryViewModel, RegistryCreateRequest } from '../../models/registry';
|
||||||
|
import { PorImageRegistryModel } from 'Docker/models/porImageRegistry';
|
||||||
|
|
||||||
angular.module('portainer.app')
|
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';
|
'use strict';
|
||||||
var service = {};
|
var service = {};
|
||||||
|
|
||||||
|
@ -79,25 +81,35 @@ angular.module('portainer.app')
|
||||||
return $q.all(promises);
|
return $q.all(promises);
|
||||||
};
|
};
|
||||||
|
|
||||||
service.retrieveRegistryFromRepository = function(repository) {
|
async function retrievePorRegistryModelFromRepositoryAsync(repository) {
|
||||||
var deferred = $q.defer();
|
try {
|
||||||
console.log('registry', repository);
|
const model = new PorImageRegistryModel();
|
||||||
|
const [registries, dockerhub] = await Promise.all([
|
||||||
var imageDetails = ImageHelper.extractImageAndRegistryFromRepository(repository);
|
service.registries(),
|
||||||
$q.when(imageDetails.registry ? service.registries() : DockerHubService.dockerhub())
|
DockerHubService.dockerhub()
|
||||||
.then(function success(data) {
|
]);
|
||||||
var registry = data;
|
registries.concat([dockerhub]);
|
||||||
if (imageDetails.registry) {
|
const registry = _.find(registries, (reg) => _.includes(repository, reg.URL));
|
||||||
registry = RegistryHelper.getRegistryByURL(data, imageDetails.registry);
|
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;
|
||||||
|
}
|
||||||
|
return model;
|
||||||
|
} catch (err) {
|
||||||
|
throw { msg: 'Unable to retrieve the registry associated to the repository', err: err }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
deferred.resolve(registry);
|
|
||||||
})
|
|
||||||
.catch(function error(err) {
|
|
||||||
deferred.reject({ 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;
|
return service;
|
||||||
}]);
|
}]);
|
||||||
|
|
||||||
|
// retrieveRegistryFromRepository
|
Loading…
Add table
Add a link
Reference in a new issue