Skip to content

Instantly share code, notes, and snippets.

@midoriiro
Created November 15, 2023 18:08
Show Gist options
  • Save midoriiro/58b6d16d1578e030e7078917a5872290 to your computer and use it in GitHub Desktop.
Save midoriiro/58b6d16d1578e030e7078917a5872290 to your computer and use it in GitHub Desktop.
Convert OCI image to LXC format
Function Convert-Image
{
Param (
[Parameter(Mandatory = $true)]
[string]$Name,
[Parameter(Mandatory = $true)]
[string]$Tag,
[Parameter(Mandatory = $false)]
[string[]]$ServicesToDisable,
[Parameter(Mandatory = $false)]
[string[]]$ConfigurationFilesToCopy,
[Parameter(Mandatory = $false)]
[string]$ConfigurationFilesOwner,
[Parameter(Mandatory = $false)]
[string]$ConfigurationFilesMode
)
Read-Profile
Write-Host "Run LXC image converter with options:"
Show-Parameters -Parameters $PSBoundParameters
$BaseLocation = "/data/image"
$ContainerLocation = "/tmp/container"
$ContainerName = "oci"
$RootFileSystemLocation = "$ContainerLocation/$ContainerName/rootfs"
$OciArchiveImage = "oci-archive:${Name}:${Tag}"
$UncompressedTarName = "$Name-$Tag.tar"
$CompressedTarName = "$UncompressedTarName.zst"
Write-Host "Unpack to LXC format..."
/usr/bin/skopeo copy "docker-archive:$BaseLocation/$UncompressedTarName" $OciArchiveImage
/usr/bin/lxc-create `
oci `
--logpriority DEBUG `
--lxcpath $ContainerLocation `
--template oci -- --url "$OciArchiveImage"
Write-Host "Update root file system..."
Write-Host "`t * Mount mountpoints..."
/usr/bin/mount --types proc /proc "$RootFileSystemLocation/proc/"
/usr/bin/mount --types sysfs /sys "$RootFileSystemLocation/sys/"
/usr/bin/mount --rbind --make-rslave /dev "$RootFileSystemLocation/dev/"
Write-Host "`t * Install packages..."
/usr/sbin/chroot $RootFileSystemLocation apt update
/usr/sbin/chroot $RootFileSystemLocation apt install init -y
/usr/sbin/chroot $RootFileSystemLocation apt install ifupdown2 -y
Write-Host "`t * Install systemd services..."
$ServiceFilenames = Get-ChildItem -Path /data/services -File -Name
/usr/bin/cp /data/services/* $RootFileSystemLocation/lib/systemd/system/.
foreach($ServiceFilename in $ServiceFilenames)
{
Write-Host "`t |-- $ServiceFilename"
/usr/sbin/chroot $RootFileSystemLocation chmod 644 /lib/systemd/system/$ServiceFilename
/usr/sbin/chroot $RootFileSystemLocation systemctl enable $ServiceFilename
}
Write-Host "`t * Register modules..."
/usr/bin/mkdir $RootFileSystemLocation/scripts/
/usr/bin/cp /scripts/* $RootFileSystemLocation/scripts/
/usr/sbin/chroot $RootFileSystemLocation pwsh -Command Register-Modules
Write-Host "`t * Post-install..."
if($ServicesToDisable.Count -gt 0)
{
Write-Host "`t |-- Disable systemd services..."
}
foreach($ServiceNameToDisable in $ServicesToDisable)
{
Write-Host "`t |----- $ServiceNameToDisable"
/usr/sbin/chroot $RootFileSystemLocation systemctl disable $ServiceNameToDisable
}
if($ConfigurationFilesToCopy.Count -gt 0)
{
Write-Host "`t |-- Copy configuration files..."
}
foreach($ConfigurationFileToCopy in $ConfigurationFilesToCopy)
{
Write-Host "`t |----- $ConfigurationFileToCopy"
/usr/bin/cp $ConfigurationFileToCopy $RootFileSystemLocation/$ConfigurationFileToCopy
Write-Host "`t |----- Owner '${ConfigurationFilesOwner}'"
/usr/sbin/chroot `
$RootFileSystemLocation `
chown `
${ConfigurationFilesOwner}:${ConfigurationFilesOwner} `
$ConfigurationFileToCopy
Write-Host "`t |----- Mode '${ConfigurationFilesMode}'"
/usr/sbin/chroot `
$RootFileSystemLocation `
chmod `
$ConfigurationFilesMode `
$ConfigurationFileToCopy
}
Write-Host "`t * Unmount mountpoints..."
/usr/bin/umount --recursive "$RootFileSystemLocation/dev/"
/usr/bin/umount "$RootFileSystemLocation/proc/"
/usr/bin/umount "$RootFileSystemLocation/sys/"
/usr/sbin/chroot $RootFileSystemLocation rm --recursive /dev
Write-Host "Pack '$Name' as compressed tarball..."
cd "$ContainerLocation/$ContainerName"
Write-Host "`t * Create rootfs tarball..."
/usr/bin/tar `
--numeric-owner `
--create `
--transform "s/rootfs/./" `
--file /tmp/$UncompressedTarName `
rootfs/
Write-Host "`t * Compress tarball..."
/usr/bin/zstd `
--compress `
--ultra `
--memory=128MiB `
/tmp/$UncompressedTarName
/usr/bin/mv --force /tmp/$CompressedTarName "$BaseLocation/$CompressedTarName"
Write-Host "`t * Remove base tarball..."
/usr/bin/rm "$BaseLocation/$UncompressedTarName"
}
Export-ModuleMember -Function Convert-Image
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment