Compare commits
5 Commits
4d0220f129
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d3bbe441d | ||
|
|
903eb8dcdb | ||
|
|
55aea4774a | ||
|
|
3e07284a4e | ||
|
|
d884f07838 |
12
functions
12
functions
@@ -105,3 +105,15 @@ fixPermissions () {
|
||||
# Allow container access to the workdir (SELinux)
|
||||
chcon -t container_file_t -R "$1"
|
||||
}
|
||||
|
||||
|
||||
debug () {
|
||||
|
||||
[[ -n $_debug ]] && echo "debug: " "$@"
|
||||
}
|
||||
|
||||
|
||||
silent () {
|
||||
|
||||
[[ -z $_silent ]] && echo "$@"
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ podmanRunEasy () {
|
||||
|
||||
cat <<-'EOF'
|
||||
USAGE
|
||||
podman-run-easy [-m _mode] [-w PATH] [-d PATH] [-i _image] [--systemd] [--mkexec] [--help]
|
||||
podmanRunEasy [-m _mode] [-w PATH] [-d PATH] [-i _image] [--userfix] [--mkexec] [--help]
|
||||
[--silent] [--debug] [COMMANDS [ARGS...]]
|
||||
|
||||
COMMANDS
|
||||
@@ -86,11 +86,6 @@ OPTIONS
|
||||
This will form the base of the container name and should be unique to each project
|
||||
Default: Container name will be set based on a concatenation of the image and commands
|
||||
|
||||
--systemd
|
||||
Force container to init with systemd (--systemd=always)
|
||||
Default: --systemd=true (systemd will only start if CMD is systemd, /usr/sbin/init or
|
||||
/sbin/init)
|
||||
|
||||
--array, -a ARRAY
|
||||
Read arguments from an existing or new ARRAY (bash >= 4.3)
|
||||
This is useful to reduce parsing errors and recommended for build-wrapper plugins
|
||||
@@ -117,7 +112,7 @@ EOF
|
||||
unset _array
|
||||
|
||||
# Parse input and set switches using getopt
|
||||
if _input=$(getopt -o +m:w:d:i:a:n:xsh -l mode:,workdir:,maskdir:,image:,array:,name:,mkexec,systemd,silent,debug,help -- "$@"); then
|
||||
if _input=$(getopt -o +m:w:d:i:a:n:xh -l mode:,workdir:,maskdir:,image:,array:,name:,mkexec,silent,debug,help -- "$@"); then
|
||||
eval set -- "$_input"
|
||||
while true; do
|
||||
case "$1" in
|
||||
@@ -149,9 +144,6 @@ EOF
|
||||
--mkexec|-x)
|
||||
_mkexec="true"
|
||||
;;
|
||||
--systemd|-s)
|
||||
_systemd="true"
|
||||
;;
|
||||
--silent)
|
||||
_silent="true"
|
||||
;;
|
||||
@@ -201,10 +193,10 @@ EOF
|
||||
declare -ga _pre_options_array
|
||||
_pre_options_array+=("-it")
|
||||
#[[ "$_mode" == "ephemeral" ]] && _pre_options_array+=("--rm")
|
||||
_pre_options_array+=("-v" "${_workdir}:${_workdir}")
|
||||
_pre_options_array+=("-v" "${_workdir}:${_workdir}:Z")
|
||||
_pre_options_array+=("-w" "${_workdir}")
|
||||
_pre_options_array+=("--userns=keep-id") # Fix user permission problems by default
|
||||
[[ -n $_maskdir ]] && _pre_options_array+=("-v" "${_maskdir}")
|
||||
[[ -n $_systemd ]] && _pre_options_array+=("--systemd=always")
|
||||
[[ -n $_debug ]] && echo "_pre_options_array:" "${_pre_options_array[@]}"
|
||||
|
||||
}
|
||||
|
||||
@@ -13,17 +13,17 @@ podmanRunWrapper () {
|
||||
cat <<-'EOF'
|
||||
USAGE
|
||||
Argument mode:
|
||||
podman-run-wrapper -m MODE -o OPTIONS -i IMAGE [-n CONTAINER_NAME]
|
||||
[--help] [--silent] [--debug] [COMMANDS [ARGS...]]
|
||||
podmanRunWrapper -m MODE -o OPTIONS -i IMAGE [-n CONTAINER_NAME] [--help]
|
||||
[--debug] [COMMANDS [ARGS...]]
|
||||
|
||||
Array mode (bash >= 4.3):
|
||||
podman-run-wrapper -a ARRAY
|
||||
podmanRunWrapper -a ARRAY
|
||||
|
||||
EXAMPLE
|
||||
podman-run-wrapper -m ephemeral -o "-it -v $PWD:$PWD -w $PWD" -i "php:latest" -c "php ./script.php"
|
||||
podmanRunWrapper -m ephemeral -o "-it -v $PWD:$PWD -w $PWD" -i "php:latest" -c "php ./script.php"
|
||||
|
||||
ARRAY=( "-m" "ephemeral" "-o" "--rm -it -v $PWD:$PWD -w $PWD" "-i" "php:latest" "-c" "php ./script.php")
|
||||
podman-run-wrapper -a ARRAY
|
||||
podmanRunWrapper -a ARRAY
|
||||
|
||||
COMMANDS
|
||||
COMMANDS to run in the container (e.g. the current active file, an external build script, a
|
||||
@@ -37,7 +37,6 @@ OPTIONS
|
||||
1. ephemeral
|
||||
2. persistent
|
||||
3. recreate-persistent
|
||||
4. remove-persistent
|
||||
|
||||
--options, -o OPTIONS
|
||||
OPTIONS to pass directly to `podman run` or `podman exec` depending on the mode or
|
||||
@@ -65,9 +64,6 @@ OPTIONS
|
||||
--selinuxfix
|
||||
A temporary hack to grant SELinux write access on $PWD until a better fix is found
|
||||
|
||||
--silent, -s
|
||||
Only print errors
|
||||
|
||||
--debug, -d
|
||||
Print debugging
|
||||
|
||||
@@ -88,7 +84,7 @@ EOF
|
||||
unset _mode _cmds_arr _opts_arr _options _prw_opts_arr _image _name _array _selinux_fix
|
||||
|
||||
# Use getopt to print help
|
||||
if INPUT=$(getopt -o +m:o:i:x:n:a:sdh -l mode:,options:,image:,name:,array:,optionsarray:,commandsarray:,selinuxfix,silent,debug,help -- "$@"); then
|
||||
if INPUT=$(getopt -o +m:o:i:x:n:a:dh -l mode:,options:,image:,name:,array:,optionsarray:,commandsarray:,selinuxfix,debug,help -- "$@"); then
|
||||
eval set -- "$INPUT"
|
||||
while true; do
|
||||
case "$1" in
|
||||
@@ -98,7 +94,7 @@ EOF
|
||||
;;
|
||||
--options|-o)
|
||||
shift
|
||||
_options="$1"
|
||||
_options+=("$1")
|
||||
;;
|
||||
--image|-i)
|
||||
shift
|
||||
@@ -126,11 +122,8 @@ EOF
|
||||
--help|-h)
|
||||
_printHelpAndExit 0
|
||||
;;
|
||||
--silent|-s)
|
||||
_silent="1"
|
||||
;;
|
||||
--debug|-d)
|
||||
_debug="1"
|
||||
export _debug="1"
|
||||
echo "Debugging on!"
|
||||
;;
|
||||
--)
|
||||
@@ -155,16 +148,13 @@ EOF
|
||||
return
|
||||
fi
|
||||
|
||||
# Parse podman options
|
||||
# Parse podman options from --optionsarray
|
||||
if [[ -n $_opts_arr ]]; then
|
||||
# namerefs are awesome
|
||||
declare -gn _prw_opts_arr="$_opts_arr"
|
||||
# If not array mode optionally load podman options from input string
|
||||
elif [[ -n $_options ]]; then
|
||||
declare -ga _prw_opts_arr
|
||||
for _option in $_options; do
|
||||
_prw_opts_arr+=("$_option")
|
||||
done
|
||||
# If no array given, parse input from options
|
||||
elif [[ ${#_options[@]} -ge 1 ]]; then
|
||||
declare -ga _prw_opts_arr=("${_options[@]}")
|
||||
else
|
||||
echo "Must provide --options or the name of an existing --optionsarray"
|
||||
_printHelpAndExit 1
|
||||
@@ -181,12 +171,12 @@ EOF
|
||||
declare -ga _prw_cmds_arr
|
||||
_prw_cmds_arr=("$@")
|
||||
if [[ ${#_prw_cmds_arr[@]} -lt 1 ]]; then
|
||||
[[ -z $_silent ]] && echo "Warning: running container without any commands"
|
||||
debug "Running container without any commands"
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ -n $_debug ]] && echo "_prw_opts_arr:" "${_prw_opts_arr[@]}"
|
||||
[[ -n $_debug ]] && echo "_prw_cmds_arr:" "${_prw_cmds_arr[@]}"
|
||||
debug "_prw_opts_arr:" "${_prw_opts_arr[@]}"
|
||||
debug "_prw_cmds_arr:" "${_prw_cmds_arr[@]}"
|
||||
}
|
||||
|
||||
|
||||
@@ -211,10 +201,9 @@ EOF
|
||||
|
||||
_removeContainer() {
|
||||
|
||||
if podman container exists "$_cname"; then
|
||||
[[ -z $_silent ]] && echo "Removing container: $_cname"
|
||||
[[ -n $_debug ]] && echo "podman rm -v -f $_cname"
|
||||
podman rm -v -f "$_cname"
|
||||
if podman container exists "$1"; then
|
||||
debug "podman rm -v -f $1"
|
||||
podman rm -v -f "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -222,14 +211,12 @@ EOF
|
||||
_runContainer() {
|
||||
|
||||
# Run _remove_container first to not run in existing container
|
||||
if podman container exists "${_cname}"; then
|
||||
[[ -z $_silent ]] && echo "Reusing container: $_cname"
|
||||
[[ -n $_debug ]] && echo podman exec "$_cname" sh -c "${_prw_cmds_arr[@]}"
|
||||
podman exec "$_cname" sh -c "${_prw_cmds_arr[@]}"
|
||||
if podman container exists "$1"; then
|
||||
debug podman exec "$1" sh -c "${_prw_cmds_arr[@]}"
|
||||
podman exec "$1" sh -c "${_prw_cmds_arr[@]}"
|
||||
exit $?
|
||||
else
|
||||
[[ -z $_silent ]] && echo "Running in container: $_cname"
|
||||
[[ -n $_debug ]] && echo "Command: podman run" "${_prw_opts_arr[@]}" "$_image" sh -c "${_prw_cmds_arr[@]}"
|
||||
debug "Command: podman run" "${_prw_opts_arr[@]}" "$_image" sh -c "${_prw_cmds_arr[@]}"
|
||||
podman run "${_prw_opts_arr[@]}" "$_image" "${_prw_cmds_arr[@]}"
|
||||
exit $?
|
||||
fi
|
||||
@@ -240,7 +227,7 @@ EOF
|
||||
####### EXECUTE #########
|
||||
#########################
|
||||
|
||||
_execute () {
|
||||
__main() {
|
||||
|
||||
# Get input
|
||||
_parseInput "$@"
|
||||
@@ -252,26 +239,40 @@ EOF
|
||||
[[ -n $_selinux_fix ]] && fixPermissions "$PWD"
|
||||
|
||||
# Execute podman
|
||||
if [[ $_mode == "ephemeral" || $_mode == "recreate-persistent" ]]; then
|
||||
_removeContainer
|
||||
_runContainer
|
||||
elif [[ $_mode == "remove-persistent" ]]; then
|
||||
_removeContainer
|
||||
elif [[ $_mode == "persistent" ]]; then
|
||||
_runContainer
|
||||
else
|
||||
echo "Unknown mode!"
|
||||
_printHelpAndExit 1
|
||||
if [[ "$_mode" =~ ^(ephemeral|recreate-persistent)$ ]]; then
|
||||
_removeContainer "$_cname"
|
||||
fi
|
||||
|
||||
_runContainer "$_cname"
|
||||
}
|
||||
|
||||
# Allow this function to be executed directly
|
||||
_execute "$@"
|
||||
__main "$@"
|
||||
exit $?
|
||||
}
|
||||
|
||||
# Allow script to be called directly
|
||||
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
|
||||
# No imported functions
|
||||
#source-functions
|
||||
|
||||
_getBaseDir () {
|
||||
# Get base directory name of where this script resides
|
||||
# https://stackoverflow.com/questions/59895/how-to-get-the-source-directory-of-a-bash-script-from-within-the-script-itself#comment54598418_246128
|
||||
_basedir=$(dirname "$(readlink -f "$0")")
|
||||
}
|
||||
|
||||
_sourceFunctions () {
|
||||
# Get the location of this file
|
||||
_getBaseDir
|
||||
# Go up two directories
|
||||
ff="${_basedir%/*/*}/functions"
|
||||
# Source functions file
|
||||
if [[ -f "$ff" ]]; then
|
||||
source "$ff"
|
||||
else
|
||||
echo "Cannot find functions file: ${ff}"
|
||||
fi
|
||||
}
|
||||
|
||||
_sourceFunctions
|
||||
podmanRunWrapper "$@"
|
||||
fi
|
||||
|
||||
241
plugins/toolboxRun/toolboxRun
Normal file
241
plugins/toolboxRun/toolboxRun
Normal file
@@ -0,0 +1,241 @@
|
||||
#!/usr/bin/env bash
|
||||
# shellcheck disable=SC1090
|
||||
|
||||
toolboxRun () {
|
||||
|
||||
_printHelpAndExit () {
|
||||
|
||||
cat <<-'EOF'
|
||||
USAGE
|
||||
toolboxRun -c NAME [-i NAME] [-r RELEASE] [--no-sh] [-h] [-s] [-d] [COMMANDS [ARGS...]]
|
||||
|
||||
COMMANDS
|
||||
|
||||
COMMANDS to run in the container (e.g. the current active file, an external
|
||||
build script, a program residing in the container, etc.)
|
||||
Can be empty (default entrypoint)
|
||||
|
||||
OPTIONS
|
||||
|
||||
--container NAME, -c NAME
|
||||
Assign a different NAME to the toolbox container. This is useful for creating multiple
|
||||
toolbox containers from the same base image, or for entirely customized containers from
|
||||
custom-built base images.
|
||||
|
||||
If the toolbox container NAME already exists, the command passed to toolboxRun will be
|
||||
executed in the existing toolbox. If toolbox container NAME does not exist, it will be
|
||||
created and the COMMAND will then be run in it.
|
||||
|
||||
--image NAME, -i NAME
|
||||
Change the NAME of the base image used to create the toolbox container. This is useful for
|
||||
creating containers from custom-built base images.
|
||||
|
||||
--release RELEASE, -r RELEASE
|
||||
Create a toolbox container for a different operating system RELEASE than the host.
|
||||
|
||||
--ephemeral
|
||||
The toolbox will be removed after the COMMAND is executed
|
||||
|
||||
--recreate
|
||||
If the toolbox NAME already exists, it will first be removed and recreated
|
||||
|
||||
--no-sh, -n
|
||||
Makes the first argument of COMMANDS executable and runs it directly
|
||||
|
||||
--debug, -d
|
||||
Display debugging output
|
||||
|
||||
--array, -a ARRAY
|
||||
Read arguments from an existing or new ARRAY (bash >= 4.3)
|
||||
This is useful to reduce parsing errors and recommended for build-wrapper plugins
|
||||
|
||||
--help, -h
|
||||
Print this help message and exit (overrides --silent)
|
||||
|
||||
EOF
|
||||
|
||||
# Exit using passed exit code
|
||||
[[ -z $1 ]] && exit 0 || exit "$1"
|
||||
}
|
||||
|
||||
|
||||
debug () {
|
||||
|
||||
[[ -n $_debug ]] && echo "debug: " "$@"
|
||||
}
|
||||
|
||||
|
||||
_parseInput () {
|
||||
|
||||
debug "${FUNCNAME[0]}" "$@"
|
||||
|
||||
# Unset vars
|
||||
unset _array
|
||||
|
||||
# Parse input and set switches using getopt
|
||||
if _input=$(getopt -o +c:i:r:nda:h -l container:,image:,release:,ephemeral,recreate,no-sh,debug,array:,help -- "$@"); then
|
||||
eval set -- "$_input"
|
||||
while true; do
|
||||
case "$1" in
|
||||
--container|-c)
|
||||
shift && _cname="$1"
|
||||
;;
|
||||
--image|-i)
|
||||
shift && _image=("-i" "$1")
|
||||
;;
|
||||
--release|-r)
|
||||
shift && _release=("-r" "$1")
|
||||
;;
|
||||
--ephemeral)
|
||||
_ephemeral="true"
|
||||
;;
|
||||
--recreate)
|
||||
_recreate="true"
|
||||
;;
|
||||
--no-sh|-n)
|
||||
_no_sh="true"
|
||||
;;
|
||||
--debug|-d)
|
||||
_debug="true"
|
||||
echo "Debugging on!"
|
||||
;;
|
||||
--array|-a)
|
||||
shift && _array="$1"
|
||||
break
|
||||
;;
|
||||
--help|-h)
|
||||
_printHelpAndExit 0
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
else
|
||||
echo "Incorrect options provided"
|
||||
_printHelpAndExit 1
|
||||
fi
|
||||
|
||||
# If array mode, load input array, reparse input, and return
|
||||
if [[ -n $_array ]]; then
|
||||
checkBashVersion
|
||||
local _n_array
|
||||
declare -n _n_array="$_array"
|
||||
_parseInput "${_n_array[@]}"
|
||||
return
|
||||
fi
|
||||
|
||||
# Create _pre_commands_array from remaining arguments
|
||||
# shift getopt parameters away
|
||||
shift $((OPTIND - 1))
|
||||
# Assume program name is first argument
|
||||
_program="$1"
|
||||
# create command array
|
||||
declare -ga _cmd_array=("$@")
|
||||
}
|
||||
|
||||
|
||||
_shWrap () {
|
||||
|
||||
debug "${FUNCNAME[0]}"
|
||||
|
||||
if [[ -z $_no_sh ]]; then
|
||||
_cmd_array=("sh" "-c" "${_cmd_array[*]}")
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
_toolboxExists () {
|
||||
|
||||
debug "${FUNCNAME[0]}" "$1"
|
||||
|
||||
toolbox list -c | cut -d ' ' -f 3 | grep -w "$1" > /dev/null 2>&1
|
||||
}
|
||||
|
||||
|
||||
_toolboxCreate () {
|
||||
|
||||
debug "${FUNCNAME[0]}" "$1" "${_image[@]}" "${_release[@]}"
|
||||
|
||||
toolbox create -c "$1" "${_image[@]}" "${_release[@]}"
|
||||
}
|
||||
|
||||
|
||||
_toolboxRemove () {
|
||||
|
||||
debug "${FUNCNAME[0]}" "$1"
|
||||
|
||||
toolbox rm -f "$1"
|
||||
}
|
||||
|
||||
|
||||
_toolboxRun () {
|
||||
|
||||
debug "${FUNCNAME[0]}" "$1" "${_cmd_array[@]}"
|
||||
|
||||
toolbox run -c "$1" "${_cmd_array[@]}"
|
||||
}
|
||||
|
||||
|
||||
__main () {
|
||||
|
||||
# Get input
|
||||
_parseInput "$@"
|
||||
|
||||
# Make sure the first argument is executable
|
||||
chmod +x "$_program"
|
||||
|
||||
# Wrap command with `sh -c` by default
|
||||
_shWrap
|
||||
|
||||
# Check if container exists
|
||||
if _toolboxExists "$_cname"; then
|
||||
if [[ -n $_recreate || -n $_ephemeral ]]; then
|
||||
_toolboxRemove "$_cname"
|
||||
fi
|
||||
else
|
||||
_toolboxCreate "$_cname"
|
||||
fi
|
||||
|
||||
_toolboxRun "$_cname"
|
||||
|
||||
if [[ -n $_ephemeral ]]; then
|
||||
_toolboxRemove "$_cname"
|
||||
fi
|
||||
}
|
||||
|
||||
# Allow this function to be executed directly
|
||||
__main "$@"
|
||||
}
|
||||
|
||||
|
||||
# Allow this file to be executed directly if not being sourced
|
||||
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||
|
||||
# The following functions are usually handled by build-wrapper
|
||||
|
||||
_getBaseDir () {
|
||||
# Get base directory name of where this script resides
|
||||
# https://stackoverflow.com/questions/59895/how-to-get-the-source-directory-of-a-bash-script-from-within-the-script-itself#comment54598418_246128
|
||||
_basedir=$(dirname "$(readlink -f "$0")")
|
||||
}
|
||||
|
||||
|
||||
_sourceFunctions () {
|
||||
# Get the location of this file
|
||||
_getBaseDir
|
||||
# Go up two directories
|
||||
ff="${_basedir%/*/*}/functions"
|
||||
# Source functions file
|
||||
if [[ -f "$ff" ]]; then
|
||||
source "$ff"
|
||||
else
|
||||
echo "Cannot find functions file: ${ff}"
|
||||
fi
|
||||
}
|
||||
|
||||
_sourceFunctions
|
||||
toolboxRun "$@"
|
||||
fi
|
||||
Reference in New Issue
Block a user