summary refs log tree commit diff
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2020-12-03 12:51:03 +0100
committerRobert Günzler <r@gnzler.io>2020-12-07 19:28:05 +0100
commit1a71ce1c53510c1b9163b38acf60ecaaa7aa4c6f (patch)
tree27a9f8a21afd9e55a93083d8785f0cc98165ae13
parent350871c9a2ff125fb6b7093d1cb2915d64173e87 (diff)
bin/enter: allow becoming root in container
-rwxr-xr-xbin/enter46
1 files changed, 33 insertions, 13 deletions
diff --git a/bin/enter b/bin/enter
index d646541..61c1fb7 100755
--- a/bin/enter
+++ b/bin/enter
@@ -5,29 +5,32 @@ set -e
 target=
 img=""
 dockerfile="${PWD}/Dockerfile"
-become=
 priv=
+opts=
+become=
 
 usage() {
-	printf "usage: %s OPTIONS -- [DOCKER RUN ARGS]\n" "$(basename "$0")"
+	printf "usage: %s OPTIONS -- [ARGS]\n" "$(basename "$0")"
 	printf "\n"
 	printf "  -t TARGET\n"
 	printf "  -i IMAGE\n"
 	printf "  -f DOCKERFILE\n"
-	printf "  -u (become user)\n"
+	printf "  -o EXTRA OPTIONS\n"
 	printf "  -D (run with elevated privileged, but not privileged)\n"
+	printf "  -B (don't reassign uid/gid)\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
+while getopts t:i:f:o:BDh o; do
 	case $o in
 	t) 	target="$OPTARG" ;;
 	i) 	img="$OPTARG" ;;
 	f) 	dockerfile="$OPTARG" ;;
-	u) 	become=1 ;;
+	o)	opts="$OPTARG" ;;
 	D)	priv=1 ;;
+	B)	become=1 ;;
 	h|?) 	usage ;;
 	esac
 done
@@ -36,19 +39,36 @@ 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 "$become" ] && extra_args="${extra_args} "
 [ -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 ";
+	extra_args="${extra_args} \
+		--tmpfs=/run --tmpfs=/sys/fs/cgroup \
+		--sysctl=net.ipv4.ip_forward=1 \
+		--security-opt=apparmor:unconfined --security-opt=seccomp:unconfined \
+		--cap-add NET_ADMIN --cap-add SYS_ADMIN --cap-add SYS_RESOURCE \
+		--tmpfs=/var/lib/docker";
+}
+# make the container transparent
+[ -z "$priv" ] && {
+	extra_args="${extra_args} \
+		--privileged \
+		--mount=type=bind,src=${HOME},target=/home/robert,ro \
+		--network=host";
 }
 
+[ -n "$opts" ] && extra_args="${extra_args} ${opts}"
+
 # 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")"
+	docker build --tag="$img" --target="$target" --file="$dockerfile" "$PWD"
+
+[ -z "$become" ] && \
+	extra_args="${extra_args} --user="$(id -u):$(id -g)""
 
-exec docker run --rm -it --mount=type=bind,src="$PWD",dst=/src -w /src $@ $extra_args "$img"
+ep="sh"
+[ -n "$1" ] && { ep="$1"; shift; }
+exec docker run --rm -it \
+	--entrypoint="$ep" \
+	--mount=type=bind,src="$PWD",dst=/src -w /src $extra_args "$img" $@