#!/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