#!/usr/bin/env bash # usage usage() { USAGE=$(cat </aDirectoryName will use command "./callFancyScriptInDirectory" when changing directory into it. - DOCKER_COMPOSE_UPDATE_COMMAND="sudo docker-compose down; sudo docker-compose pull; sudo docker-compose up -d;" // the default update command for deployments - DOCKER_COMPOSE_UPDATE_FAIL_ON_UPDATE_ERROR="false" // if set to true, script fails if at least one update procedure failed You can copy this script to '/usr/local/bin' and use create a custom CONFIG_FILE as user. Examples can be found in '/usr/share/doc/'. EOF ) echo "$USAGE"; } set -e; declare -A DOCKER_COMPOSE_UPDATE_COMMANDS; # check for config file apply_config() { local config=$1; if [[ ! -f "$config" ]]; then echo "No config file specified"; echo ""; usage; exit 1; fi set -a; source "$config"; set +a; } source_config() { local config=$1; local configFallback=$2; local configGlobalFallback=$3; if [[ -f "$config" ]]; then apply_config "$config"; return; fi if [[ -f "$configFallback" ]]; then apply_config "$configFallback"; return; fi if [[ -f "$configGlobalFallback" ]]; then apply_config "$configGlobalFallback"; return; fi } apply_defaults() { [[ -z ${DOCKER_COMPOSE_UPDATE_IGNORES} ]] && DOCKER_COMPOSE_UPDATE_IGNORES=(); [[ -z ${DOCKER_COMPOSE_UPDATE_COMMAND} ]] && DOCKER_COMPOSE_UPDATE_COMMAND="docker-compose down; docker-compose pull; docker-compose up -d;" [[ -z ${DOCKER_COMPOSE_UPDATE_FAIL_ON_UPDATE_ERROR} ]] && DOCKER_COMPOSE_UPDATE_FAIL_ON_UPDATE_ERROR="false"; } check_required() { if [[ -z ${DOCKER_COMPOSE_UPDATE_BASEDIR} ]]; then echo "DOCKER_COMPOSE_UPDATE_BASEDIR is required" exit 1; fi if [[ -z ${DOCKER_COMPOSE_UPDATE_COMMAND} ]]; then echo "DOCKER_COMPOSE_UPDATE_COMMAND is required" exit 1; fi } # check requirements CONFIG_FILE="$1"; FALLBACK_CONFIG_FILE="${HOME}/.docker_compose_update.conf"; FALLBACK_CONFIG_GLOBAL_FILE="/etc/docker_compose_update.conf"; source_config "${CONFIG_FILE}" "${FALLBACK_CONFIG_FILE}" "${FALLBACK_CONFIG_GLOBAL_FILE}"; apply_defaults; check_required; # DO NOT TOUCH BELOW currentDir=$(pwd) cd "${DOCKER_COMPOSE_UPDATE_BASEDIR}"; for dir in *; do if [ -d "${dir}" ]; then basename=$(basename "${dir}") ignore=false; for ignorePattern in "${DOCKER_COMPOSE_UPDATE_IGNORES[@]}"; do if [[ "${basename}" == *"${ignorePattern}"* ]]; then ignore=true; fi done if [[ "${ignore}" == "true" ]]; then echo "Ignoring '${basename}'"; continue; fi echo "Handling '${basename}'"; updateCommand="" for cmd in "${!DOCKER_COMPOSE_UPDATE_COMMANDS[@]}"; do if [[ "${cmd}" == "${basename}" ]]; then updateCommand="${DOCKER_COMPOSE_UPDATE_COMMANDS[$cmd]}"; fi done if [[ -n "${updateCommand}" ]]; then echo "Using custom command '${updateCommand}'"; else updateCommand="${DOCKER_COMPOSE_UPDATE_COMMAND}"; echo "Using command '${DOCKER_COMPOSE_UPDATE_COMMAND}'"; fi cd "${basename}"; if [[ "${DOCKER_COMPOSE_UPDATE_FAIL_ON_UPDATE_ERROR}" == "false" ]]; then set +e; fi res=$(eval "${updateCommand}") if [[ "${DOCKER_COMPOSE_UPDATE_FAIL_ON_UPDATE_ERROR}" == "false" ]]; then set -e; fi cd "../"; echo ""; fi done