File: docker-host

package info (click to toggle)
distrobox 1.8.2.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,524 kB
  • sloc: sh: 5,946; makefile: 4
file content (63 lines) | stat: -rwxr-xr-x 2,058 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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} "$@"