summary refs log tree commit diff
path: root/bin/enter
blob: d6465412d2ba44962c55644d3b213e37fe011116 (plain) (blame)
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
#!/bin/sh
set -e
[ -n "$DEBUG" ] && set -x

target=
img=""
dockerfile="${PWD}/Dockerfile"
become=
priv=

usage() {
	printf "usage: %s OPTIONS -- [DOCKER RUN ARGS]\n" "$(basename "$0")"
	printf "\n"
	printf "  -t TARGET\n"
	printf "  -i IMAGE\n"
	printf "  -f DOCKERFILE\n"
	printf "  -u (become user)\n"
	printf "  -D (run with elevated privileged, but not privileged)\n"
	printf "\n"
	printf "Enter the container defined in Dockerfile, with \$PWD mounted at /src\n"
	exit 2
}

while getopts t:i:f:uDh o; do
	case $o in
	t) 	target="$OPTARG" ;;
	i) 	img="$OPTARG" ;;
	f) 	dockerfile="$OPTARG" ;;
	u) 	become=1 ;;
	D)	priv=1 ;;
	h|?) 	usage ;;
	esac
done
shift $((OPTIND - 1))

[ -z "$img" ] && img="$(basename "$(dirname "$(readlink -f -- "$dockerfile")")")"

extra_args=
[ -n "$become" ] && extra_args="${extra_args}--user=$(id -u):$(id -g) "
[ -n "$priv"   ] && {
	extra_args="${extra_args}--tmpfs=/run --tmpfs=/sys/fs/cgroup ";
	extra_args="${extra_args}--sysctl=net.ipv4.ip_forward=1 ";
	extra_args="${extra_args}--security-opt=apparmor:unconfined --security-opt=seccomp:unconfined ";
	extra_args="${extra_args}--cap-add NET_ADMIN --cap-add SYS_ADMIN --cap-add SYS_RESOURCE ";
	extra_args="${extra_args}--tmpfs=/var/lib/docker ";
}

# allow setting this to some non-file value to skip building
# > enter -i alpine -f none
# for a quick alpine based container with $PWD mounted in
[ -f "$dockerfile" ] && \
	docker build --tag="$img" --target="$target" --file="$dockerfile" "$(dirname "$dockerfile")"

exec docker run --rm -it --mount=type=bind,src="$PWD",dst=/src -w /src $@ $extra_args "$img"