vscode: improve podman wrapper, add docker wrapper, fix reconnections

Improve wrapper by using pure podman, dropping using distrobox.
Inject ENV and change default USER.
Add Docker wrapper
This improves stability, reliability of the wrapper.

Fix #1421

Signed-off-by: Luca Di Maio <luca.dimaio1@gmail.com>
This commit is contained in:
Luca Di Maio
2024-06-20 15:57:27 +02:00
parent 2bad9f9497
commit 3147de0d10
2 changed files with 95 additions and 30 deletions
+63
View File
@@ -0,0 +1,63 @@
#!/bin/sh
id="$(echo "$@" | grep -Eo ' [a-zA-Z0-9]{64} ' | tr -d ' ')"
DOCKER_COMMAND="$(command -v docker 2> /dev/null)"
ENV_COMMAND="printenv"
# if we're in a flatpak, we fallback to host-spawn
if [ -n "${FLATPAK_ID}" ]; then
DOCKER_COMMAND="flatpak-spawn --host docker"
ENV_COMMAND="flatpak-spawn --host printenv"
fi
# This little workaround is used to ensure
# we use our distrobox to properly enter the container
if echo "$@" | grep -q 'exec'; then
# we do this procedure only for distroboxes
# we will leave regular containers alone.
if [ "$(${DOCKER_COMMAND} inspect --type container --format '{{ index .Config.Labels "manager" }}' "${id}")" = "distrobox" ]; then
# Ensure that our distrobox containers will use different vscode-servers
# by symlinking to different paths
# This is necessary because vscode-server will always use $HOME/.vscode-server
# so we're forced to do this workaround
if [ -n "${id}" ]; then
# shellcheck disable=SC2016
${DOCKER_COMMAND} exec -u "${USER}" "${id}" /bin/sh -c '
if [ ! -L "${HOME}/.vscode-server" ]; then
[ -e "${HOME}/.vscode-server" ] && mv "${HOME}/.vscode-server" /var/tmp
[ -d /var/tmp/.vscode-server ] || mkdir /var/tmp/.vscode-server
ln -sf /var/tmp/.vscode-server "$HOME"
elif [ ! -e "${HOME}/.vscode-server" ]; then
mkdir /var/tmp/.vscode-server
ln -sf /var/tmp/.vscode-server "$HOME"
fi
'
fi
for i; do
# interject root:root, we want to be our own user
if echo "${i}" | grep -q "root:root"; then
set -- "$@" "${USER}:${USER}"
shift
# inject host's environment
elif echo "${i}" | grep -q "exec"; then
set -- "$@" "exec"
shift
# inject host's environment
for j in $(${ENV_COMMAND} | grep '=' | grep -Ev ' |"|`|\$' |
# refer to distrobox-enter:L454
grep -Ev '^(CONTAINER_ID|HOST|HOSTNAME|HOME|PATH|PROFILEREAD|SHELL|XDG_SEAT|XDG_VTNR|XDG_.*_DIRS|^_)'); do
set -- "$@" "--env"
set -- "$@" "${j}"
done
else
set -- "$@" "${i}"
shift
fi
done
fi
fi
${DOCKER_COMMAND} "$@"
+32 -30
View File
@@ -2,59 +2,61 @@
id="$(echo "$@" | grep -Eo ' [a-zA-Z0-9]{64} ' | tr -d ' ')"
PODMAN_COMMAND="$(command -v podman 2> /dev/null)"
DISTROBOX_COMMAND="$(command -v distrobox 2> /dev/null)"
ENV_COMMAND="printenv"
# if we're in a flatpak, use podman-remote
# else we fallback to host-spawn
# if we're in a flatpak, we fallback to host-spawn
if [ -n "${FLATPAK_ID}" ]; then
if command -v podman-remote > /dev/null 2>&1; then
PODMAN_COMMAND="podman-remote"
else
PODMAN_COMMAND="flatpak-spawn --host podman"
fi
DISTROBOX_COMMAND="flatpak-spawn --host distrobox"
PODMAN_COMMAND="flatpak-spawn --host podman"
ENV_COMMAND="flatpak-spawn --host printenv"
fi
# This little workaround is used to ensure
# we use our distrobox to properly enter the container
if echo "$@" | grep -q 'exec'; then
# if exec && distrobox -> use distrobox-enter --
# we do this procedure only for distroboxes
# we will leave regular containers alone.
if [ "$(${PODMAN_COMMAND} inspect --type container --format '{{ index .Config.Labels "manager" }}' "${id}")" = "distrobox" ]; then
# Ensure that our distrobox containers will use different vscode-servers by symlinking to different paths
# Ensure that our distrobox containers will use different vscode-servers
# by symlinking to different paths
# This is necessary because vscode-server will always use $HOME/.vscode-server
# so we're forced to do this workaround
if [ -n "${id}" ]; then
# shellcheck disable=SC2016
${PODMAN_COMMAND} exec -u "${USER}" "${id}" /bin/sh -c '
if [ ! -L "${HOME}/.vscode-server" ]; then
[ -e "${HOME}/.vscode-server" ] && mv "${HOME}/.vscode-server" /var/tmp
[ -d /var/tmp/.vscode-server ] && mkdir /var/tmp/.vscode-server
[ -d /var/tmp/.vscode-server ] || mkdir /var/tmp/.vscode-server
ln -sf /var/tmp/.vscode-server "$HOME"
elif [ ! -e "${HOME}/.vscode-server" ]; then
mkdir /var/tmp/.vscode-server
ln -sf /var/tmp/.vscode-server "$HOME"
fi
'
fi
# Remove everything from $@ and leave only the execution part, we start
# capturing after we meet our ID
dbox_args="-e A=B"
capture="false"
for i; do
if [ "${capture}" = "true" ]; then
set -- "$@" "${i}"
elif echo "${i}" | grep -q "VSCODE"; then
dbox_args="${dbox_args} -e ${i}"
elif echo "${i}" | grep -q "\-w"; then
dbox_args="${dbox_args} -w ${2}"
fi
if [ "${i}" = "${id}" ]; then
capture="true"
fi
shift
done
# interject root:root, we want to be our own user
if echo "${i}" | grep -q "root:root"; then
set -- "$@" "${USER}:${USER}"
shift
# inject host's environment
elif echo "${i}" | grep -q "exec"; then
set -- "$@" "exec"
shift
# inject host's environment
for j in $(${ENV_COMMAND} | grep '=' | grep -Ev ' |"|`|\$' |
# refer to distrobox-enter:L454
grep -Ev '^(CONTAINER_ID|HOST|HOSTNAME|HOME|PATH|PROFILEREAD|SHELL|XDG_SEAT|XDG_VTNR|XDG_.*_DIRS|^_)'); do
${DISTROBOX_COMMAND} enter --additional-flags "${dbox_args}" "${id}" -- "$@"
exit $?
set -- "$@" "--env"
set -- "$@" "${j}"
done
else
set -- "$@" "${i}"
shift
fi
done
fi
fi