feat: add on the fly volume creating and mapping to the host including bind mounting
parent
9b90e79d4d
commit
4bc6727f20
102
lib/src/try
102
lib/src/try
|
@ -9,22 +9,42 @@
|
||||||
try_container () {
|
try_container () {
|
||||||
|
|
||||||
declare -A arch=( ["x86_64"]="" ["aarch64"]="-arm64")
|
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
|
[[ $# -lt 1 ]] && echo "image name required to try" && return 1
|
||||||
|
|
||||||
declare OPTION; declare OPTARG; declare OPTIND
|
declare OPTION; declare OPTARG; declare OPTIND
|
||||||
OPTIND=0
|
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}
|
# echo processing: option:$OPTION argument:$OPTARG index:$OPTIND remaining:${@:$OPTIND}
|
||||||
case "$OPTION" in
|
case "$OPTION" in
|
||||||
u)
|
u)
|
||||||
ruser=$OPTARG
|
cuser=$OPTARG
|
||||||
|
;;
|
||||||
|
b)
|
||||||
|
bind=true
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
save=true
|
||||||
|
;;
|
||||||
|
m)
|
||||||
|
mp=$OPTARG
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
hmp=$OPTARG
|
||||||
|
;;
|
||||||
|
e)
|
||||||
|
evar="-e $OPTARG"
|
||||||
;;
|
;;
|
||||||
t)
|
t)
|
||||||
TAG=$OPTARG
|
TAG=$OPTARG
|
||||||
;;
|
;;
|
||||||
p)
|
p)
|
||||||
PROD=$OPTARG
|
priv=--privileged
|
||||||
|
;;
|
||||||
|
r)
|
||||||
|
prod=$OPTARG
|
||||||
;;
|
;;
|
||||||
*) echo unknown run option -$OPTARG
|
*) echo unknown run option -$OPTARG
|
||||||
echo "USAGE: try <options>"
|
echo "USAGE: try <options>"
|
||||||
|
@ -35,12 +55,13 @@ try_container () {
|
||||||
|
|
||||||
shift $((OPTIND - 1))
|
shift $((OPTIND - 1))
|
||||||
|
|
||||||
user=${2:-$ruser}
|
[[ ! $1 ]] && echo must supply an image to try && return 1
|
||||||
image=$([[ $user ]] && echo ${user}/)$1
|
|
||||||
|
|
||||||
# :${TAG:-latest}
|
# user=${2:-$ruser}
|
||||||
|
image=$1
|
||||||
|
shift 1
|
||||||
|
|
||||||
if [[ $PROD ]]; then
|
if [[ $prod ]]; then
|
||||||
echo removing any local copy of image $image
|
echo removing any local copy of image $image
|
||||||
docker image rm $image
|
docker image rm $image
|
||||||
host=prod
|
host=prod
|
||||||
|
@ -53,43 +74,46 @@ try_container () {
|
||||||
name=${image//\//-}
|
name=${image//\//-}
|
||||||
image=$image:${TAG:-latest}
|
image=$image:${TAG:-latest}
|
||||||
|
|
||||||
bmount () {
|
docker rm try-$name > /dev/null 2>&1
|
||||||
[[ $1 == "-u" ]] && umount=true && shift
|
if [[ $mp ]]; then
|
||||||
declare mp=${1:-opt}
|
if [[ $bind ]];then
|
||||||
declare dir=${2:-${PWD}/_$mp}
|
dir=$(realpath "${hmp:-${PWD}/mnt/$mp}")
|
||||||
vname=try-$name-$mp
|
vname="try-$name${dir//\//-}"
|
||||||
|
mkdir -p $dir
|
||||||
if [[ $umount ]]; then
|
# echo bind $dir to volume $vname
|
||||||
echo removing volume ....
|
docker volume create --driver local \
|
||||||
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 type=none \
|
||||||
--opt device=$dir \
|
--opt device=$dir \
|
||||||
--opt o=bind \
|
--opt o=bind "$vname" > /dev/null
|
||||||
$vname
|
else
|
||||||
# echo "type=volume,dst=/$mp,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$dir"
|
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
|
fi
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
echo starting container with image: $image, and name $name
|
echo starting container with image: $image, and name $name
|
||||||
echo at container prompt type \'exit\' to exit from shell and remove trial container
|
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
|
# if script was executed then call the function
|
||||||
|
|
Loading…
Reference in New Issue