API-Docker
view release on metacpan or search on metacpan
lib/API/Docker/API/Images.pm view on Meta::CPAN
my ($self, %opts) = @_;
croak "container required" unless $opts{container};
my %params;
$params{container} = $opts{container};
$params{repo} = $opts{repo} if defined $opts{repo};
$params{tag} = $opts{tag} if defined $opts{tag};
$params{comment} = $opts{comment} if defined $opts{comment};
$params{author} = $opts{author} if defined $opts{author};
$params{pause} = $opts{pause} ? 1 : 0 if defined $opts{pause};
# `changes` is a repeated query parameter on the wire, but the engine parses
# each value as a Dockerfile snippet and a snippet may span lines, so one
# newline-joined value carries a list just as well. Measured against Podman
# 5.4.2: changes=LABEL%20a%3Db%0AEXPOSE%208080 and two separate changes=
# pairs produce the same image. The joined form is used because it fits the
# transport's one-value-per-key params encoder.
if (defined $opts{changes}) {
$params{changes} = ref $opts{changes} eq 'ARRAY'
? join("\n", @{$opts{changes}})
: $opts{changes};
}
return $self->client->post('/commit', $opts{config},
params => \%params,
%{ $self->_request_options },
);
}
sub build_prune {
my ($self, %opts) = @_;
my %params;
# The engine spells this one with a hyphen, and an unquoted
# `keep-storage => $n` is not even valid Perl -- the fat comma quotes a
# bareword identifier, and keep-storage is a subtraction. So keep_storage is
# the documented spelling, the wire name is accepted beside it for anyone
# copying out of the Engine reference, and the hyphen is what goes on the
# wire. _uri_encode leaves `-` alone, so the key survives unmangled.
my $keep_storage = $opts{keep_storage} // $opts{'keep-storage'};
$params{'keep-storage'} = $keep_storage if defined $keep_storage;
$params{all} = $opts{all} ? 1 : 0 if defined $opts{all};
$params{filters} = $self->_normalise_filters($opts{filters})
if defined $opts{filters};
return $self->client->post('/build/prune', undef,
params => \%params,
%{ $self->_request_options },
);
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
API::Docker::API::Images - Docker Engine Images API
=head1 VERSION
version 0.004
=head1 SYNOPSIS
my $docker = API::Docker->new;
# Build an image from a tar context
use Path::Tiny;
my $tar = path('context.tar')->slurp_raw;
$docker->images->build(context => $tar, t => 'myapp:latest');
# Pull an image
$docker->images->pull(fromImage => 'nginx', tag => 'latest');
# List images
my $images = $docker->images->list;
for my $image (@$images) {
say $image->id;
say join ', ', @{$image->repo_tags};
}
# Inspect image details
my $image = $docker->images->inspect('nginx:latest');
# Tag and push
$docker->images->tag('nginx:latest', repo => 'myrepo/nginx', tag => 'v1');
$docker->images->push('myrepo/nginx', tag => 'v1');
# Remove image
$docker->images->remove('nginx:latest', force => 1);
# Snapshot a container into an image
my $new = $docker->images->commit(container => $id, repo => 'myapp', tag => 'snap');
# Air-gapped roundtrip: export here, carry the tar over, load there
my $export = $docker->images->get('myapp:snap'); # raw tar bytes
$docker->images->load($export);
# Reclaim the build cache (not the same thing as prune)
$docker->images->build_prune(all => 1);
=head1 DESCRIPTION
This module provides methods for managing Docker images including pulling,
listing, tagging, pushing to registries, and removal.
C<list> and C<inspect> return generated L<API::Docker::Type> objects carrying
the convenience methods of L<API::Docker::Role::Entity::Image>, so
C<< $image->tag >> and C<< $image->remove >> work on either. Which class each
returns, and where the two disagree, is below.
Accessed via C<< $docker->images >>, or through
L<API::Docker::Role::Using/using> for a run of calls that needs its own
( run in 2.179 seconds using v1.01-cache-2.11-cpan-02e1dfdd527 )