1+ #! /bin/bash
2+ set  -euo pipefail
3+ 
4+ #  This script is a wrapper for 'podman compose down' or 'docker compose down'
5+ #  It removes the containers/services defined in the docker-compose file using 'podman rm'
6+ #  This is needed when running with kubedock, as 'compose down' cannot shut down pods directly
7+ 
8+ usage () {
9+     echo  " Usage: $0  [OPTIONS] [SERVICES]" 
10+     echo  "   OPTIONS: Options for docker-compose down (e.g., -f docker-compose.yml)" 
11+     echo  "   SERVICES: Optional list of services to remove" 
12+     exit  1
13+ }
14+ 
15+ #  Parse options and service names
16+ COMPOSE_FILE=" docker-compose.yml" 
17+ OPTIONS=()
18+ SERVICES=()
19+ while  [[ $#  -gt  0 ]];  do 
20+     case  " $1 " in 
21+         -f|--file)
22+             if  [[ -n  " ${2:- } " ;  then 
23+                 COMPOSE_FILE=" $2 " 
24+                 OPTIONS+=(" $1 " " $2 " 
25+                 shift  2
26+             else 
27+                 echo  " Error: Missing argument for $1 " 
28+                 usage
29+             fi 
30+             ;;
31+         --file=* )
32+             COMPOSE_FILE=" ${1#* =} " 
33+             OPTIONS+=(" $1 " 
34+             shift 
35+             ;;
36+         -h|--help)
37+             usage
38+             ;;
39+         -* )
40+             OPTIONS+=(" $1 " 
41+             shift 
42+             ;;
43+         * )
44+             SERVICES+=(" $1 " 
45+             shift 
46+             ;;
47+     esac 
48+ done 
49+ 
50+ #  If no -f/--file was provided, support both docker-compose.yml and docker-compose.yaml
51+ if  [[ " ${COMPOSE_FILE} " ==  " docker-compose.yml" ;  then 
52+     if  [[ -f  " docker-compose.yml" ;  then 
53+         COMPOSE_FILE=" docker-compose.yml" 
54+     elif  [[ -f  " docker-compose.yaml" ;  then 
55+         COMPOSE_FILE=" docker-compose.yaml" 
56+     else 
57+         echo  " Error: No docker-compose.yml or docker-compose.yaml found in the current directory." 
58+         exit  1
59+     fi 
60+ fi 
61+ 
62+ if  [[ !  -f  " $COMPOSE_FILE " ;  then 
63+     echo  " Error: Compose file '$COMPOSE_FILE ' not found." 
64+     exit  1
65+ fi 
66+ 
67+ #  Get service names from compose file if none specified
68+ if  [[ ${# SERVICES[@]}  -eq  0 ]];  then 
69+     #  Try to use yq if available, else fallback to grep/sed/awk
70+     if  command  -v yq > /dev/null 2>&1 ;  then 
71+         mapfile -t SERVICES <  <( yq ' .services | keys | .[]' " $COMPOSE_FILE " ) 
72+     else 
73+         #  Fallback: extract service names by finding top-level keys under 'services:'
74+         mapfile -t SERVICES <  <( awk ' /services:/ {flag=1; next} /^[^[:space:]]/ {flag=0} flag && /^[[:space:]]+[a-zA-Z0-9_-]+:/ {gsub(":",""); print $1}' " $COMPOSE_FILE " |  sed ' s/^[[:space:]]*//' ) 
75+     fi 
76+ fi 
77+ 
78+ if  [[ ${# SERVICES[@]}  -eq  0 ]];  then 
79+     echo  " No services found in compose file '$COMPOSE_FILE '." 
80+     exit  0
81+ fi 
82+ 
83+ #  Compose container name: <current-dir>-<service-name>-1
84+ PROJECT_NAME=" $( basename " $PWD " ) " 
85+ 
86+ echo  " Removing services: ${SERVICES[*]} " 
87+ for  svc  in  " ${SERVICES[@]} " ;  do 
88+     #  Try to get container_name from compose file
89+     CONTAINER_NAME=" " 
90+     if  command  -v yq > /dev/null 2>&1 ;  then 
91+         CONTAINER_NAME=$( yq " .services.${svc} .container_name // \"\" " " $COMPOSE_FILE " |  tr -d ' "' ) 
92+     fi 
93+     if  [[ -z  " $CONTAINER_NAME " ;  then 
94+         CONTAINER_NAME=" ${PROJECT_NAME} -${svc} -1" 
95+     fi 
96+     #  Check if the container exists
97+     if  !  podman ps -a --format ' {{.Names}}' |  grep -Fxq " $CONTAINER_NAME " ;  then 
98+         echo  " No container found for service '$svc ' (expected name: $CONTAINER_NAME )" 
99+         continue 
100+     fi 
101+     echo  " Removing container: $CONTAINER_NAME " 
102+     podman rm -f " $CONTAINER_NAME " 
103+ done 
104+ 
105+ echo  " All specified services have been removed." 
0 commit comments