#!/bin/bash trap exiting EXIT # Handle program exit export VARIABLES_DIR=${PWD%/*}/variables/compose source $VARIABLES_DIR source $PATH_VARS_DIR export RUN_PULL_CONTAINER=N export CREATE_VOLUME_DIR=N export CREATE_VOLUME_DIR_ONLY=N COMMAND=$1 CONTAINERS="" BASE_DIR=$PWD all () { ALL=$(ls -d */ | sed 's/\/$//') # Remove trailing backslashes } if [[ "$1" == "run" ]]; then mapfile -t PROGRAMS < <(echo "${@:3}" | tr ';' '\n') fi if [[ "$2" == "ALL" ]]; then all CONTAINERS=$ALL else CONTAINERS=$(echo "$2" | tr '|' '\n') fi # Pull if run or restart has the -P or --pull option as the 3rd arg or later if [[ "$1" == "up" || "$1" == "restart" ]]; then for arg in "${@:3}" do if [[ "$arg" == "-P" || "$arg" == "--pull" ]]; then RUN_PULL_CONTAINER=Y fi done fi # if -V or --volume is passed, create a volume directory along with a compose directory for the service being created if [[ "$1" == "create" ]]; then for arg in "${@:3}" do if [[ "$arg" == "-V" || "$arg" == "--volume" ]]; then CREATE_VOLUME_DIR=Y fi if [[ "$arg" == "--volume-only" ]]; then CREATE_VOLUME_DIR_ONLY=Y CREATE_VOLUME_DIR=Y fi done fi process () { if [[ -z "$1" ]]; then # There will be a trailing empty command in the array return; fi exe="${1/\[CONTAINER\]/"$2"}" echo "Running under \"$2\":" echo "* $exe *" bash -c "$exe" # -c is needed to run all bash syntax inside the bash instance } up () { for container in $CONTAINERS; do $PWD/$container/up & done } down () { for container in $CONTAINERS; do $PWD/$container/down & done } restart () { for container in $CONTAINERS; do $PWD/$container/restart & done } run () { for container in $CONTAINERS; do cd $BASE_DIR cd $container echo "$container:" for i in "${PROGRAMS[@]}"; do process "$i" $container done done } ed-cmp () { for container in $CONTAINERS; do nano $PWD/$container/$3 done } ed-vol () { for container in $CONTAINERS; do nano $VOLUMES_DIR/$container/$3 done } ed-var () { VAR="PATH_VAR_$2" VAR=${!VAR} if [ -z "$VAR" ] then prt-var return 0 fi nano $VAR$3 } ls-cmp () { for container in $CONTAINERS; do ls -al $PWD/$container/$3 done } ls-vol () { for container in $CONTAINERS; do ls -al $VOLUMES_DIR/$container/$3 done } ls-var () { VAR="PATH_VAR_$2" VAR=${!VAR} if [ -z "$VAR" ] then prt-var return 0 fi ls $VAR$3 } prt-var () { cat $PATH_VARS_DIR } create () { for container in $CONTAINERS; do if [[ ! -d "$container" && "$CREATE_VOLUME_DIR_ONLY" != "Y" ]]; then mkdir $container export SERVICE_NAME="$container" envsubst '${SERVICE_NAME}' < /data/docker/default/compose/docker-compose.yml > $container/docker-compose.yml cp $DEFAULT_DIR/compose/vars $container cd $container ln -s ../../default/compose/up . ln -s ../../default/compose/restart . ln -s ../../default/compose/down . cd .. sudo chown "$CREATE_OWNER:$CREATE_GROUP" $container -R sudo chmod "$CREATE_PERMISSION" $container -R sudo chmod +X $container elif [[ "$CREATE_VOLUME_DIR_ONLY" != "Y" ]]; then echo "Cannot create \"$container,\" it already exists." fi if [[ "$CREATE_VOLUME_DIR" == "Y" ]]; then if [[ ! -d "$VOLUMES_DIR/$container" ]]; then mkdir $VOLUMES_DIR/$container sudo chown "$CREATE_OWNER:$CREATE_GROUP" $VOLUMES_DIR/$container sudo chmod "$CREATE_PERMISSION" $VOLUMES_DIR/$container sudo chmod +X $VOLUMES_DIR/$container else echo "Cannot create \"$container\" volume, it already exists." fi fi done } help () { echo Local Docker-Compose Manager echo "Syntax: ./manage [command] [container] [additional parameters]" echo "Container Paremeter:" echo " * Single: " echo " * Multiple: " echo " * All: " echo "Command Parameter:" echo " * Runs in the directory of the container's docker compose (one level deep from this manage script)" echo " * Must be wrapped in quotes or escape semicolons to run multiple commands per container." echo "Available Commands: command, parameters" echo " up [container]" echo " down [container] -P/--pull" echo " restart [container] -P/--pull" echo " run [container] [command]" echo " ed-cmp [container] [extra path]" echo " ed-vol [container] [extra path]" echo " ed-var [container] [extra path]" echo " ls-cmp [container] [extra path]" echo " ls-vol [container] [extra path]" echo " ls-var [container] [extra path]" echo " prt-var [container]" echo " create [container] -V/--volume --volume-only" } case $COMMAND in up) up ;; down) down ;; restart) restart ;; run) run "$@" ;; help) help;; --help) help ;; ed-cmp) ed-cmp "$@" ;; ed-vol) ed-vol "$@" ;; ed-var) ed-var "$@" ;; ls-cmp) ls-cmp "$@" ;; ls-vol) ls-vol "$@" ;; ls-var) ls-var "$@" ;; prt-var) prt-var "$@" ;; create) create "$@" ;; *) echo "No such command '$COMMAND'" help ;; esac exiting () { echo "done" } wait #Wait for all background processes to end