diff options
| -rwxr-xr-x | bin/enter | 46 |
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" $@ |