#!/bin/bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" MANAGER_DIR="${ROOT_DIR}/manager-solution" CONFIG_FILE="${MANAGER_DIR}/manager/config.json" ENV_FILE="${MANAGER_DIR}/.env" if [[ ! -f "${CONFIG_FILE}" ]]; then echo "Missing config file: ${CONFIG_FILE}" >&2 exit 1 fi load_env_file() { local file="$1" if [[ -f "${file}" ]]; then set -a # shellcheck disable=SC1090 source "${file}" set +a fi } docker_container_exists() { docker container inspect "$1" >/dev/null 2>&1 } docker_volume_exists() { docker volume inspect "$1" >/dev/null 2>&1 } docker_image_exists() { docker image inspect "$1" >/dev/null 2>&1 } load_env_file "${ENV_FILE}" MANAGER_CONTAINER_NAME="${FIS_MANAGER_CONTAINER_NAME:-fis_manager}" MANAGER_IMAGE_NAME="${FIS_MANAGER_IMAGE:-fis-manager:local}" echo "Stopping manager stack" if [[ -f "${MANAGER_DIR}/docker-compose.yml" ]]; then ( cd "${MANAGER_DIR}" docker compose down --remove-orphans || true ) fi if docker_container_exists "${MANAGER_CONTAINER_NAME}"; then echo "Removing manager container ${MANAGER_CONTAINER_NAME}" docker rm -f "${MANAGER_CONTAINER_NAME}" || true fi if docker_image_exists "${MANAGER_IMAGE_NAME}"; then echo "Removing manager image ${MANAGER_IMAGE_NAME}" docker rmi -f "${MANAGER_IMAGE_NAME}" || true fi mapfile -t USER_RESOURCES < <( python3 - "${CONFIG_FILE}" <<'PY' import json import sys with open(sys.argv[1], encoding="utf-8") as handle: config = json.load(handle) defaults = config.get("defaults", {}) container_prefix = defaults.get("container_prefix", "fis-") default_volumes = defaults.get("volumes", {}) for user in config.get("users", []): user_id = str(user["id"]) container_name = user.get("container_name") or f"{container_prefix}{user_id}" volumes = {} volumes.update(default_volumes) volumes.update(user.get("volumes", {})) resolved_volumes = [] for volume_name in volumes: resolved_volumes.append(volume_name.format(id=user_id, port=user["port"])) print(f"CONTAINER\t{container_name}") for volume_name in resolved_volumes: print(f"VOLUME\t{volume_name}") PY ) declare -A USER_CONTAINERS=() declare -A USER_VOLUMES=() for resource in "${USER_RESOURCES[@]}"; do kind="${resource%%$'\t'*}" value="${resource#*$'\t'}" if [[ "${kind}" == "CONTAINER" ]]; then USER_CONTAINERS["${value}"]=1 elif [[ "${kind}" == "VOLUME" ]]; then USER_VOLUMES["${value}"]=1 fi done for container_name in "${!USER_CONTAINERS[@]}"; do if docker_container_exists "${container_name}"; then echo "Removing user container ${container_name}" docker rm -f "${container_name}" || true fi done for volume_name in "${!USER_VOLUMES[@]}"; do if docker_volume_exists "${volume_name}"; then echo "Removing user volume ${volume_name}" docker volume rm "${volume_name}" || true fi done echo "Cleanup completed"