mirror of
https://github.com/89luca89/distrobox.git
synced 2026-08-17 16:34:42 -05:00
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:
Executable
+63
@@ -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
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user