Dist-Zilla-Plugin-Docker-API
view release on metacpan or search on metacpan
lib/Dist/Zilla/Plugin/Docker/API/Client.pm view on Meta::CPAN
for my $entry ($dir->children) {
if ($entry->is_dir) {
push @files, $self->_collect_files($root, $entry);
}
else {
push @files, $entry;
}
}
return @files;
}
sub _push_tags {
my ($self, $docker, $tags, $result_ref) = @_;
for my $tag (@$tags) {
$self->logger->("Pushing $tag...");
my $push_progress = sub {
my ($event) = @_;
if ($event->{errorDetail}) {
$self->logger_fatal->("Push error for $tag: " . $event->{errorDetail}{message});
}
elsif ($event->{progress}) {
$self->logger->($event->{status} . ' ' . $event->{progress});
}
};
my $auth = $self->auth_for_image_ref($tag);
eval {
my $events = $docker->images->push($tag, auth => $auth);
for my $event (@{$events // []}) {
$push_progress->($event);
if ($event->{aux} && $event->{aux}{Digest}) {
$$result_ref->{digest} = $event->{aux}{Digest};
}
}
};
if ($@) {
$self->logger->("Warning: failed to push $tag: $@");
}
else {
push @{ $$result_ref->{pushed} }, $tag;
}
}
}
sub auth_for_image_ref {
my ($self, $image_ref) = @_;
my $registry = $self->_registry_for_image_ref($image_ref);
return $self->_auth_for_registry($registry);
}
sub _registry_for_image_ref {
my ($self, $image_ref) = @_;
# Strip ":tag" or "@sha256:..." suffix from the image part.
my $name = $image_ref;
$name =~ s/\@sha256:.*$//;
my @parts = split m{/}, $name;
# If the first component does NOT look like a registry host
# (no dot, no colon, not "localhost"), it's an implicit Docker Hub repo.
if (@parts < 2 || ($parts[0] !~ /[.:]/ && $parts[0] ne 'localhost')) {
return 'https://index.docker.io/v1/';
}
return $parts[0];
}
sub _auth_for_registry {
my ($self, $registry) = @_;
my $config = $self->_docker_config;
my $auths = $config->{auths} // {};
my @candidates = ($registry);
if ($registry eq 'https://index.docker.io/v1/'
|| $registry eq 'index.docker.io'
|| $registry eq 'docker.io') {
push @candidates,
'https://index.docker.io/v1/',
'https://index.docker.io/v2/',
'index.docker.io',
'docker.io';
}
my $entry;
for my $key (@candidates) {
if (exists $auths->{$key}) {
$entry = $auths->{$key};
last;
}
}
return undef unless $entry;
my %auth = (serveraddress => $registry);
if ($entry->{identitytoken}) {
$auth{identitytoken} = $entry->{identitytoken};
return \%auth;
}
if ($entry->{auth}) {
my $decoded = eval { decode_base64($entry->{auth}) };
if (defined $decoded && $decoded =~ /^([^:]+):(.*)$/s) {
$auth{username} = $1;
$auth{password} = $2;
return \%auth;
}
}
if (defined $entry->{username} || defined $entry->{password}) {
$auth{username} = $entry->{username} if defined $entry->{username};
$auth{password} = $entry->{password} if defined $entry->{password};
return \%auth;
}
return undef;
}
( run in 0.830 second using v1.01-cache-2.11-cpan-71847e10f99 )