150 lines
4.3 KiB
Bash
Executable File
150 lines
4.3 KiB
Bash
Executable File
#!/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 vname; local prod; local priv
|
|
local hostmp; local efile; local entrypoint; local evar
|
|
local envf; local image; local append_distro; local options
|
|
|
|
declare OPTION; declare OPTARG; declare OPTIND
|
|
OPTIND=0
|
|
while getopts 'lf:o:dpr:t:u:m:h:kv:e:s:' OPTION; do
|
|
# echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND}
|
|
case "$OPTION" in
|
|
s)
|
|
entrypoint="--entrypoint $OPTARG"
|
|
;;
|
|
e)
|
|
if ! source_env_file $OPTARG; then return 2; fi
|
|
efile=true
|
|
;;
|
|
f)
|
|
envf="--env-file $OPTARG"
|
|
;;
|
|
d)
|
|
dryrun="echo "
|
|
;;
|
|
u)
|
|
cuser=$OPTARG
|
|
;;
|
|
l)
|
|
# append distro name to image name
|
|
append_distro=true
|
|
;;
|
|
k)
|
|
keep=true
|
|
;;
|
|
# s)
|
|
# save=true
|
|
# ;;
|
|
m)
|
|
mp=$OPTARG
|
|
;;
|
|
o)
|
|
options=$OPTARG
|
|
;;
|
|
h)
|
|
hmp=$OPTARG
|
|
;;
|
|
v)
|
|
evar="-e $OPTARG"
|
|
;;
|
|
t)
|
|
TAG=$OPTARG
|
|
;;
|
|
p)
|
|
priv=--privileged
|
|
;;
|
|
r)
|
|
prod=$OPTARG
|
|
;;
|
|
*) echo unknown run option -$OPTARG
|
|
echo "USAGE: try <options>"
|
|
echo "available options: -t <latest> custom tag "
|
|
;;
|
|
esac
|
|
done
|
|
|
|
shift $((OPTIND - 1))
|
|
|
|
[[ ! $efile ]] && source_env_file
|
|
|
|
image=$(make_image_name $@)
|
|
|
|
echo image name to try: $image
|
|
|
|
[[ ! $image ]] && echo must supply an image to try && return 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
|
|
hostmp="${hmp:-${PWD}/mnt/$mp}"
|
|
[[ ! $(isAbsPath $hostmp) ]] && hostmp=$PWD/$hostmp
|
|
vname="try-$name${dir//\//-}"
|
|
mkdir -p "$hostmp"
|
|
# echo bind $dir to volume $vname
|
|
$dryrun docker volume create --driver local \
|
|
--opt type=none \
|
|
--opt device=$hostmp \
|
|
--opt o=bind "$vname" > /dev/null
|
|
[[ ! $dryrun ]] && echo directory $mp in container will be mounted at $hostmp
|
|
# 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
|
|
# echo via volume $vname
|
|
# echo linking $dkpath to $hostmp
|
|
# $dryrun 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
|
|
# --entrypoint /opt/scripts/entrypoint.sh \
|
|
$dryrun docker run -i -t --rm $priv $evar $options \
|
|
${entrypoint} ${evnf} \
|
|
$([[ $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 ]] && [[ ! $dryrun ]]; then
|
|
# if [[ ! $save ]]; then
|
|
echo removing volume $vname used for mapping
|
|
docker volume rm $vname > /dev/null
|
|
if [[ $keep ]]; then
|
|
echo mounted container directory $mp on host at $hostmp will not be removed
|
|
else
|
|
echo deleting directory at mountpoint $hostmp mapped to $mp in container
|
|
echo "use option -k to keep this directory after exiting container"
|
|
echo "useful for testing scripts inside the container"
|
|
rm -rf $hostmp
|
|
fi
|
|
# [[ ! $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 "$@" |