92 lines
2.1 KiB
Bash
Executable File
92 lines
2.1 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=/tmp/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" --keep-dirlinks
|
|
|
|
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
|
|
PrivateUsers=false
|
|
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
|