#!/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