194 lines
6.0 KiB
Bash
Executable File
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
|