Files
run-with-podman/run-with-podman.sh
2020-01-25 12:51:42 -05:00

194 lines
6.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# README; print this help message
print_help () {
cat <<-'EOF'
Usage: run-with-podman.sh --file FILE [--file-path PATH] [--mode [0,1,2]]
[--mask-dir PATH] [--image IMAGE_NAME] [--force-systemd]
[--help] [--] $OPTIONS
--file,-f FILE
The local script to execute in the container (typically sent from your IDE)
--file-path PATH
Path that the script operates on (Default: the --file directory)
--mode,-m 0,1,2
0. Nonpersistent container (always recreate) (Default)
1. Persistent container
2. Recreate persistent container
--mask-dir PATH
Hide this directory from the host OS, store contents in the container only (Default: unset)
(Useful for capturing output in the container only for easy reset)
--image,-i IMAGE_NAME
The name of the image to execute the script (Default: fedora:latest)
--force-systemd
Force container to init with systemd support
--help,-h
Print this help message and exit
-- [additional arguments to pass to --file FILE]
Parsed as "quoted string"
EOF
}
# DEFAULTS
MODE="0"
IMAGE="fedora:latest"
SYSTEMD="on" # "on" is the podman default; "always" forces systemd init
# Parse input
function parse_input () {
if options=$(getopt -o fmih -l file:,file-path:,mode:,mask-dir:,image:,force-systemd,help -- "$@"); then
eval set -- "$options"
while true; do
case "$1" in
--file| -f)
shift
FILE_ACTIVE="$1"
;;
--file-path)
shift
FILE_ACTIVE_PATH="$1"
;;
--mode| -m)
shift
MODE="$1"
;;
--mask-dir)
shift
MASK_DIR="$1"
;;
--image| -i)
shift
IMAGE="$1"
;;
--force-systemd)
SYSTEMD="always" # force systemd init
;;
--help |-h)
print_help
exit $?
;;
--)
shift
break
;;
esac
shift
done
else
echo "Incorrect options provided"
exit 1
fi
[[ -z $FILE_ACTIVE ]] && echo "You must provide a --file" && exit 1
# If --file-path not set, extract FILE_ACTIVE_PATH from FILE_ACTIVE
[[ -z $FILE_ACTIVE_PATH ]] && FILE_ACTIVE_PATH=${FILE_ACTIVE%/*}
! [[ -d "$FILE_ACTIVE_PATH" ]] &&
# Pass any remaining positional arguments as script options
OPTIONS=${*:$OPTIND}
}
# Get input
parse_input "${@}"
# Sanitize filename for unique container name
CLEAN="${FILE_ACTIVE//_/}" && CLEAN="${CLEAN// /_}" &&
CLEAN="${CLEAN//[^a-zA-Z0-9_]/}" && CLEAN="${CLEAN,,}"
# Allow container access to the pwd
chcon -t container_file_t -R "${FILE_ACTIVE_PATH}"
# Nonpersistent container (always recreate)
if [[ $MODE == "0" ]]; then
if podman container exists "atom-${CLEAN}-nonpersistent"; then
podman rm -v -f "atom-${CLEAN}-nonpersistent"
fi
echo "Building in nonpersistent container: atom-${CLEAN}-nonpersistent"
if [[ -n $MASK_DIR ]]; then
podman run \
-it \
--systemd="${SYSTEMD}" \
--name "atom-${CLEAN}-nonpersistent" \
-v "${FILE_ACTIVE_PATH}:${FILE_ACTIVE_PATH}" \
-v "${FILE_ACTIVE_PATH}/${MASK_DIR}" \
-w "${FILE_ACTIVE_PATH}" \
"${IMAGE}" \
/bin/bash -c "chmod 755 ${FILE_ACTIVE} && ${FILE_ACTIVE} ${OPTIONS}"
else
podman run \
-it \
--systemd="${SYSTEMD}" \
--name "atom-${CLEAN}-nonpersistent" \
-v "${FILE_ACTIVE_PATH}:${FILE_ACTIVE_PATH}" \
-w "${FILE_ACTIVE_PATH}" \
"${IMAGE}" \
/bin/bash -c "chmod 755 ${FILE_ACTIVE} && ${FILE_ACTIVE} ${OPTIONS}"
fi
# Persistent container
elif [[ $MODE == "1" ]]; then
echo "Reusing container: atom-${CLEAN}-persistent"
if podman container exists "atom-${CLEAN}-persistent"; then
echo "Using existing container!"
podman exec "atom-${CLEAN}-persistent" \
/bin/bash -c "chmod 755 {FILE_ACTIVE} && {FILE_ACTIVE}"
else
if [[ -n $MASK_DIR ]]; then
podman run \
-it \
--systemd="${SYSTEMD}" \
--name "atom-${CLEAN}-persistent" \
-v "{FILE_ACTIVE_PATH}:{FILE_ACTIVE_PATH}" \
-v "{FILE_ACTIVE_PATH}/${MASK_DIR}" \
-w "{FILE_ACTIVE_PATH}" \
"${IMAGE}" \
/bin/bash -c "chmod 755 {FILE_ACTIVE} && {FILE_ACTIVE} ${OPTIONS}"
else
podman run \
-it \
--systemd="${SYSTEMD}" \
--name "atom-${CLEAN}-persistent" \
-v "{FILE_ACTIVE_PATH}:{FILE_ACTIVE_PATH}" \
-w "{FILE_ACTIVE_PATH}" \
"${IMAGE}" \
/bin/bash -c "chmod 755 {FILE_ACTIVE} && {FILE_ACTIVE} ${OPTIONS}"
fi
fi
# Recreate persistent container
elif [[ $MODE == "2" ]]; then
echo "Building in container: atom-${CLEAN}-persistent"
if podman container exists "atom-${CLEAN}-persistent"; then
echo "Container exists! Resetting container."
podman rm -v -f "atom-${CLEAN}-persistent"
fi
if [[ -n $MASK_DIR ]]; then
podman run \
-it \
--systemd="${SYSTEMD}" \
--name "atom-${CLEAN}-persistent" \
-v "{FILE_ACTIVE_PATH}:{FILE_ACTIVE_PATH}" \
-v "{FILE_ACTIVE_PATH}/${MASK_DIR}" \
-w "{FILE_ACTIVE_PATH}" \
"${IMAGE}" \
/bin/bash -c "chmod 755 {FILE_ACTIVE} && {FILE_ACTIVE} ${OPTIONS}"
else
podman run \
-it \
--systemd="${SYSTEMD}" \
--name "atom-${CLEAN}-persistent" \
-v "{FILE_ACTIVE_PATH}:{FILE_ACTIVE_PATH}" \
-w "{FILE_ACTIVE_PATH}" \
"${IMAGE}" \
/bin/bash -c "chmod 755 {FILE_ACTIVE} && {FILE_ACTIVE} ${OPTIONS}"
fi
fi