Files
nspawn-oci/oci-import.sh
T

90 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
source=$1
hostname=$2
if [[ -v 3 ]];then
convert=true;else
convert=false;fi
cat << end
source=$source
hostname=$hostname
convert=$convert
end
workdir=/dev/shm/nspawn-oci
mkdir -p $workdir
skopeo_output=$(echo $workdir/$source | sed s.://./.g)
#mkdir -p $skopeo_output
#skopeo copy $source oci:$skopeo_output:latest
umoci_output=$workdir/$hostname
#rm -rf $umoci_output
#umoci --verbose unpack --image $skopeo_output $umoci_output
oci_config=$umoci_output/config.json
if $convert;then
# nspawn mode
mkdir -p /etc/systemd/nspawn
nspawn_config=/etc/systemd/nspawn/$hostname.nspawn
cat << end > $nspawn_config
[Exec]
ProcessTwo=true
end
for environment in $(jq --compact-output '.process.env' $oci_config | sed "s/[][]//g;s/\"//g;s/,/ /g")
do
echo $environment
cat << end >> $nspawn_config
Environment=$environment
end
done
cat << end >> $nspawn_config
WorkingDirectory=$(jq --compact-output '.process.cwd' $oci_config | sed "s/[][]//g;s/\"//g;s/,/ /g")
Parameters=$(jq --compact-output '.process.args' $oci_config | sed "s/[][]//g;s/,/ /g")
[Network]
VirtualEthernet=no
[Files]
end
for mount in $(jq -c '.mounts[]' $oci_config); do
source=$(echo $mount | jq -r '.source' )
echo $source
if [ $source == 'none' ]; then
echo 'container requires bind mount'
destination=$(echo $mount | jq -r '.destination')
read -p "$destination:" source
cat << end >> $nspawn_config
Bind=$source:$destination
end
fi
done
machinectl import-fs $umoci_output/rootfs $2
echo "Edit $nspawn_config before starting"
else
# oci mode
mkdir -p /etc/systemd/system/systemd-nspawn@$hostname.service.d/
override=/etc/systemd/system/systemd-nspawn@$hostname.service.d/override.conf
cat << end > $override
[Service]
ExecStart=systemd-nspawn --oci-bundle=/var/lib/machines/%i --machine %i
end
machinectl import-fs $umoci_output $hostname
echo "Edit /var/lib/machines/$hostname/config.json before starting"
fi
cat << end
Start/Enable with systemd-nspawn@$hostname.service
$hostname created from $source
end