From 4bc6727f2023a165e8124fbfe79e2a84181ec8cc Mon Sep 17 00:00:00 2001 From: "kebler.net" Date: Sat, 21 Jan 2023 22:47:00 -0800 Subject: [PATCH] feat: add on the fly volume creating and mapping to the host including bind mounting --- lib/src/try | 102 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 39 deletions(-) diff --git a/lib/src/try b/lib/src/try index 99c3b3c..bc91682 100755 --- a/lib/src/try +++ b/lib/src/try @@ -9,22 +9,42 @@ try_container () { declare -A arch=( ["x86_64"]="" ["aarch64"]="-arm64") + local mp;local cuser; local hmp; local bind; local vname; local prod; local priv + local dkpath; local hostmp; local evar; local hostmap [[ $# -lt 1 ]] && echo "image name required to try" && return 1 declare OPTION; declare OPTARG; declare OPTIND OPTIND=0 - while getopts 'pt:u:' OPTION; do + while getopts 'pr:t:u:m:h:be:s' OPTION; do # echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND} case "$OPTION" in u) - ruser=$OPTARG + cuser=$OPTARG + ;; + b) + bind=true + ;; + s) + save=true + ;; + m) + mp=$OPTARG + ;; + h) + hmp=$OPTARG + ;; + e) + evar="-e $OPTARG" ;; t) - TAG=$OPTARG - ;; + TAG=$OPTARG + ;; p) - PROD=$OPTARG + priv=--privileged + ;; + r) + prod=$OPTARG ;; *) echo unknown run option -$OPTARG echo "USAGE: try " @@ -35,12 +55,13 @@ try_container () { shift $((OPTIND - 1)) - user=${2:-$ruser} - image=$([[ $user ]] && echo ${user}/)$1 + [[ ! $1 ]] && echo must supply an image to try && return 1 - # :${TAG:-latest} + # user=${2:-$ruser} + image=$1 + shift 1 - if [[ $PROD ]]; then + if [[ $prod ]]; then echo removing any local copy of image $image docker image rm $image host=prod @@ -53,43 +74,46 @@ try_container () { name=${image//\//-} image=$image:${TAG:-latest} - bmount () { - [[ $1 == "-u" ]] && umount=true && shift - declare mp=${1:-opt} - declare dir=${2:-${PWD}/_$mp} - vname=try-$name-$mp - - if [[ $umount ]]; then - echo removing volume .... - docker volume rm $vname - echo "volume $vname was removed" - echo "Do you want to also delete the bound volume directory $dir?" - read -n 1 -p "Warning: ALL changes in $mp directory in container will be lost! [y]=>" REPLY - [[ $REPLY != "y" ]] && echo -e "\n" && exit 0 - sudo rm -rf $dir - else - mkdir -p $dir - docker volume create --driver local \ + docker rm try-$name > /dev/null 2>&1 + if [[ $mp ]]; then + if [[ $bind ]];then + dir=$(realpath "${hmp:-${PWD}/mnt/$mp}") + vname="try-$name${dir//\//-}" + mkdir -p $dir + # echo bind $dir to volume $vname + docker volume create --driver local \ --opt type=none \ --opt device=$dir \ - --opt o=bind \ - $vname - # echo "type=volume,dst=/$mp,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$dir" + --opt o=bind "$vname" > /dev/null + else + vname="try-$name-${mp//\//-}" + hostmap="-e HOST_MAP=$(id -u):$(id -g)" + dkpath=$(docker info | grep -i "Docker Root Dir" | cut -d':' -f2)/volumes/$vname/_data + hostmp=${hmp:-${PWD}/mnt/$mp} + echo via volume $vname + echo linking $dkpath to $hostmp + ln -s $dkpath -T $hostmp + fi fi - - } echo starting container with image: $image, and name $name echo at container prompt type \'exit\' to exit from shell and remove trial container - docker rm try-$name > /dev/null 2>&1 - docker run -i -t --rm --entrypoint /usr/bin/env --name try-$name --hostname try-$host-$name \ - -v "$(bmount)":/opt \ - $image \ - /bin/bash -l - echo "done with session, removing containter try-$name" - - bmount -u + docker run -i -t --rm $priv $evar $hostmap --entrypoint /opt/scripts/entrypoint.sh \ + $([[ $cuser ]] && echo "--user $cuser") \ + --name try-$name --hostname try-$host-$name \ + $([[ $mp ]] && echo "-v $vname:/$mp") \ + "$image" \ + "$@" + echo "done with session, removing containter try-$name" + if [[ $mp ]]; then + if [[ ! $save ]]; then + echo removing volume $vname used for mapping + docker volume rm $vname > /dev/null + [[ ! $bind ]] && [[ -h $hostmp ]] && echo "removing link at $hostmp" && rm $hostmp + fi + fi + } # if script was executed then call the function