#!/bin/sh set -eu if [ "$#" -ne 1 ]; then echo "Usage: $0 who_need_help_e2e_RUN_ID" >&2 exit 1 fi project=$1 case "$project" in who_need_help_e2e_*) ;; *) echo "Refusing to stop a non-E2E Compose project: $project" >&2 exit 1 ;; esac ROOT=$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd) E2E_ENV=${WNH_E2E_ENV_FILE:-"$ROOT/output/runtime/e2e.env"} run_id=${project#who_need_help_e2e_} if [ ! -f "$E2E_ENV" ]; then echo "Missing generated E2E runtime state: $E2E_ENV" >&2 exit 1 fi # Compose still resolves required interpolation values for `down`. These values # mirror the exact per-run tags. The project label passed above remains the # Compose resource scope. export APP_IMAGE="who-need-help:e2e-$run_id" export SOCKET_PROXY_IMAGE="who-need-help:socket-proxy-e2e-$run_id" export POSTGIS_IMAGE="who-need-help:postgis-e2e-$run_id" export E2E_TEST_IMAGE="who-need-help-e2e-tests:$run_id" export E2E_OUTPUT_DIR="$ROOT/output/e2e/stop-placeholder" export E2E_UID E2E_UID=$(id -u) export E2E_GID E2E_GID=$(id -g) export TRAEFIK_PROJECT_CONSTRAINT="$project" export TRAEFIK_APP_NAME="$project" export TRAEFIK_DOCKER_NETWORK="${project}_ingress" export MAP_TILE_URL="/__e2e__/map-tile.png?z={z}&x={x}&y={y}" docker compose \ --project-name "$project" \ --env-file "$E2E_ENV" \ --file "$ROOT/compose.yaml" \ --file "$ROOT/compose.e2e.yaml" \ down --remove-orphans postgres_volume="${project}_postgres_data" if docker volume inspect "$postgres_volume" >/dev/null 2>&1; then observed_project=$(docker volume inspect --format \ '{{index .Labels "com.docker.compose.project"}}' "$postgres_volume") observed_volume=$(docker volume inspect --format \ '{{index .Labels "com.docker.compose.volume"}}' "$postgres_volume") remaining_refs=$(docker ps -aq --filter "volume=$postgres_volume") if [ "$observed_project" != "$project" ] || \ [ "$observed_volume" != "postgres_data" ] || \ [ -n "$remaining_refs" ]; then echo "Refusing to remove unexpected or referenced E2E volume: $postgres_volume" >&2 exit 1 fi docker volume rm "$postgres_volume" fi for image in "$E2E_TEST_IMAGE" "$APP_IMAGE" "$POSTGIS_IMAGE" "$SOCKET_PROXY_IMAGE"; do if docker image inspect "$image" >/dev/null 2>&1; then referenced=false for container_id in $(docker ps -aq --filter "ancestor=$image"); do observed_image=$(docker inspect --format '{{.Config.Image}}' "$container_id") if [ "$observed_image" = "$image" ]; then referenced=true break fi done if [ "$referenced" = true ]; then echo "Refusing to remove referenced E2E image: $image" >&2 exit 1 fi docker image rm "$image" fi done