Container-Buildah
view release on metacpan or search on metacpan
lib/Container/Buildah/Stage.pm view on Meta::CPAN
((defined $user_home) ? ("--home-dir=$user_home") : ()), $user_name],
);
}
# import tarballs from each stage we depend upon
my $consumes = $self->get_consumes;
if (defined $consumes) {
if (ref $consumes eq "ARRAY") {
my @in_stages = @$consumes;
my $cwd = getcwd();
foreach my $in_stage (@in_stages) {
my $tarball_in = $self->tarball($in_stage);
$self->debug("in ".$self->get_name." stage before untar; pid=$$ cwd=$cwd tarball=$tarball_in");
(-f $tarball_in) or croak "consume(".join(" ", @in_stages)."): ".$tarball_in." not found";
$self->add({dest => "/"}, $tarball_in);
}
} else {
croak "consume stage->consumes was set but not an array ref";
}
}
return;
}
# drop leading slash from a path
# private class function
sub dropslash
{
my $str = shift;
if (substr($str,0,1) eq '/') {
substr($str,0,1,'');
}
return $str;
}
# export tarball for availability to other container stages if configured
# private instance method
sub produce
{
my $self = shift;
# export directories to tarball for product of this stage
my $produces = $self->get_produces;
if (defined $produces) {
if (ref $produces eq "ARRAY") {
my $tarball_out = $self->tarball;
my $cb = Container::Buildah->instance();
my @product_dirs;
foreach my $product (@$produces) {
push @product_dirs, dropslash($product);
}
# move any existing tarball to backup
if ( -f $tarball_out ) {
rename $tarball_out, $tarball_out.".bak";
}
# create the tarball
my $cwd = getcwd();
$self->debug("in ".$self->get_name." stage before tar; pid=$$ cwd=$cwd product_dirs="
.join(" ", @product_dirs));
# ignore tar exit code 1 - appears to be unavoidable and meaningless when building on an overlayfs
my $nonzero = sub { my $ret=shift; if ($ret>1) {croak "tar exited with code $ret";}};
$cb->cmd({name => "tar", nonzero => $nonzero}, "/usr/bin/tar", "--create", "--bzip2",
"--preserve-permissions", "--sparse", "--file=".$tarball_out, "--directory=".$self->get_mnt, @product_dirs);
} else {
croak "product: stage->consumes was set but not an array ref";
}
}
return;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Container::Buildah::Stage - object used by Container::Buildah to track a stage of a multi-stage container build
=head1 VERSION
version 0.3.1
=head1 SYNOPSIS
# Container::Buildah:Stage objects are created only by Container::Buildah
# It passes a separate instance to each stage function
sub stage_runtime
{
my $stage = shift;
$stage->run( [qw(/sbin/apk --update upgrade)] );
$stage->add( { dest => "/opt/swpkg" }, "tarball.tar.xz" );
$stage->config({
env => ["SWPKG_LOG=-g"],
volume => [qw(/var/cache/swpkg)],
port => ["8881"],
entrypoint => "/opt/swpkg/entrypoint.sh",
});
}
=head1 DESCRIPTION
B<Container::Buildah:Stage> objects are created and used by B<Container::Buildah>.
These are passed to the callback function for each build-stage container.
The class contains methods which are wrappers for the buildah subcommands that require a container name parameter
on the command line.
However, the container name is within the object.
So it is not passed as a separate parameter to these methods.
Each instance contains the configuration information for that stage of the build.
B<Container::Buildah::Stage> automatically adds the I<--add-history> option so that each action will be recorded
as part of the OCI container build history.
=head1 METHODS
( run in 1.210 second using v1.01-cache-2.11-cpan-df04353d9ac )