57 lines
1.6 KiB
Bash
Executable file
57 lines
1.6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
die() {
|
|
echo "$1" >&2
|
|
exit 1
|
|
}
|
|
|
|
[ -z "$CONTAINER_NAME" ] && die "\$CONTAINER_NAME not set"
|
|
[ -z "$DISPLAY" ] && die "\$DISPLAY not set (you must run the script in a desktop environment"
|
|
|
|
# From <https://liolok.com/run-desktop-app-with-systemd-nspawn-container>
|
|
if [[ -n $DBUS_SESSION_BUS_ADDRESS ]]; then # remove prefix
|
|
host_bus=${DBUS_SESSION_BUS_ADDRESS#unix:path=}
|
|
else # default guess
|
|
host_bus=$XDG_RUNTIME_DIR/bus
|
|
fi
|
|
|
|
if [[ -n $PULSE_SERVER ]]; then # remove prefix
|
|
host_pulse=${PULSE_SERVER#unix:}
|
|
else # default guess
|
|
host_pulse=$XDG_RUNTIME_DIR/pulse
|
|
fi
|
|
|
|
# Default username
|
|
run_as=user
|
|
homedir=/home/user
|
|
if [ "$CONTAINER_RUN_AS_ROOT" = true ]; then
|
|
run_as=root
|
|
homedir=/root
|
|
fi
|
|
|
|
sudo systemd-nspawn -M $CONTAINER_NAME \
|
|
`# DNS (when containers do not have their own netns)` \
|
|
--bind-ro=/run/systemd/resolve/stub-resolv.conf:/etc/resolv.conf \
|
|
`# GPU` \
|
|
--bind=/dev/dri/card0 \
|
|
--bind=/dev/shm \
|
|
--property=DeviceAllow='char-drm rw' \
|
|
`# Input devices` \
|
|
--bind-ro=/dev/input \
|
|
--property=DeviceAllow='char-input r' \
|
|
`# Xorg / Xwayland` \
|
|
--bind-ro=/tmp/.X11-unix \
|
|
--setenv=DISPLAY=$DISPLAY \
|
|
`# PulseAudio` \
|
|
--bind-ro=$host_pulse:/run/host/pulse \
|
|
--setenv=PULSE_SERVER=unix:/run/host/pulse/native \
|
|
`# DBus` \
|
|
--bind-ro=$host_bus:/run/host/bus \
|
|
--setenv=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/host/bus \
|
|
`# Scaling `\
|
|
--setenv=GDK_SCALE="$GDK_SCALE" \
|
|
`# Extra params` \
|
|
$SYSTEMD_NSPAWN_EXTRA_ARGS \
|
|
`# Launch app` \
|
|
--user=$run_as --chdir=$homedir --as-pid2 $@
|