#!/bin/bash # starts a trail container with passed image with a bash prompt # $1 image name, $2 user # user can be also prepended by using u option # added tag is "latest" by default, use t option for alternate tag # if p flag is used script will scrub any local image and attempt to download a deployed to docker image 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 'pr:t:u:m:h:be:s' OPTION; do # echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND} case "$OPTION" in u) cuser=$OPTARG ;; b) bind=true ;; s) save=true ;; m) mp=$OPTARG ;; h) hmp=$OPTARG ;; e) evar="-e $OPTARG" ;; t) TAG=$OPTARG ;; p) priv=--privileged ;; r) prod=$OPTARG ;; *) echo unknown run option -$OPTARG echo "USAGE: try " echo "available options: -t custom tag " ;; esac done shift $((OPTIND - 1)) [[ ! $1 ]] && echo must supply an image to try && return 1 # user=${2:-$ruser} image=$1 shift 1 if [[ $prod ]]; then echo removing any local copy of image $image docker image rm $image host=prod else host=local # TODO change this image=${image/:/${arch[$(uname -p)]}:} fi name=${image//\//-} image=$image:${TAG:-latest} 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" > /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 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 (return 0 2>/dev/null) || try_container $@