This aims to add basic support for the Open Container Initiative image format according to the specification. [0]
[0] https://github.com/opencontainers/image-spec/blob/main/spec.md Signed-off-by: Filip Schauer <f.scha...@proxmox.com> --- src/PVE/API2/LXC.pm | 53 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm index 5c6ee57..520b926 100644 --- a/src/PVE/API2/LXC.pm +++ b/src/PVE/API2/LXC.pm @@ -19,9 +19,11 @@ use PVE::Storage; use PVE::RESTHandler; use PVE::RPCEnvironment; use PVE::ReplicationConfig; +use PVE::RS::OCI; use PVE::LXC; use PVE::LXC::Create; use PVE::LXC::Migrate; +use PVE::LXC::Namespaces; use PVE::GuestHelpers; use PVE::VZDump::Plugin; use PVE::API2::LXC::Config; @@ -484,9 +486,54 @@ __PACKAGE__->register_method({ eval { my $rootdir = PVE::LXC::mount_all($vmid, $storage_cfg, $conf, 1); $bwlimit = PVE::Storage::get_bandwidth_limit('restore', [keys %used_storages], $bwlimit); - print "restoring '$archive' now..\n" - if $restore && $archive ne '-'; - PVE::LXC::Create::restore_archive($storage_cfg, $archive, $rootdir, $conf, $ignore_unpack_errors, $bwlimit); + my $oci_config; + + if ($restore && $archive ne '-') { + print "restoring '$archive' now..\n"; + } else { + # Try interpreting the file as an OCI image first. + # If it fails, treat it as an LXC template instead. + my $archivepath = PVE::Storage::abs_filesystem_path($storage_cfg, $archive); + my ($id_map, $root_uid, $root_gid) = PVE::LXC::parse_id_maps($conf); + $oci_config = PVE::LXC::Namespaces::run_in_userns(sub { + return PVE::RS::OCI::parse_oci_image($archivepath, $rootdir); + }, $id_map); + } + + if (defined($oci_config)) { + # OCI image extracted successfully + + # Set the entrypoint and arguments if specified by the OCI image + my @init_cmd = (); + push(@init_cmd, $oci_config->{Entrypoint}) if $oci_config->{Entrypoint}; + push(@init_cmd, $oci_config->{Cmd}) if $oci_config->{Cmd}; + if (@init_cmd) { + my $init_cmd_str = join(' ', @{ $init_cmd[0] }); + push @{$conf->{lxc}}, ['lxc.init.cmd', $init_cmd_str]; + # An entrypoint other than /sbin/init breaks the tty console mode. + # This is fixed by setting cmode: console + $conf->{cmode} = 'console'; + } + + push @{$conf->{lxc}}, ['lxc.init.cwd', $oci_config->{WorkingDir}] + if ($oci_config->{WorkingDir}); + + if (my $envs = $oci_config->{Env}) { + for my $env (@{$envs}) { + push @{$conf->{lxc}}, ['lxc.environment', $env]; + } + } + } else { + # Not an OCI image, so restore it as an LXC image instead + PVE::LXC::Create::restore_archive( + $storage_cfg, + $archive, + $rootdir, + $conf, + $ignore_unpack_errors, + $bwlimit + ); + } if ($restore) { print "merging backed-up and given configuration..\n"; -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel