#!/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") [[ $# -lt 1 ]] && echo "image name required to try" && return 1 declare OPTION; declare OPTARG; declare OPTIND OPTIND=0 while getopts 'pt:u:' OPTION; do # echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND} case "$OPTION" in u) ruser=$OPTARG ;; t) TAG=$OPTARG ;; p) PROD=$OPTARG ;; *) echo unknown run option -$OPTARG echo "USAGE: try " echo "available options: -t custom tag " ;; esac done shift $((OPTIND - 1)) user=${2:-$ruser} image=$([[ $user ]] && echo ${user}/)$1 # :${TAG:-latest} 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} 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 \ --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" 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 } # if script was executed then call the function (return 0 2>/dev/null) || try_container $@