80 lines
2.3 KiB
Bash
Executable File
80 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# showcase recreate — force-recreate services to pick up new images
|
|
|
|
CMD_RECREATE_DESC="Force-recreate a service (picks up new image)"
|
|
|
|
usage_recreate() {
|
|
cat <<'HELP'
|
|
Usage: showcase recreate <slug> [slug...] [options]
|
|
|
|
Force-recreate service containers to pick up a new Docker image.
|
|
Unlike 'restart', this ensures the container uses the latest image.
|
|
|
|
Options:
|
|
--build Rebuild the image before recreating
|
|
--no-wait Don't wait for the container to become healthy
|
|
|
|
Examples:
|
|
showcase recreate mastra # recreate with current image
|
|
showcase recreate aimock # recreate aimock (uses test compose)
|
|
showcase recreate mastra --build # rebuild + recreate
|
|
showcase recreate mastra aimock # recreate multiple services
|
|
HELP
|
|
}
|
|
|
|
cmd_recreate() {
|
|
local slugs=()
|
|
local no_wait=0
|
|
local build=0
|
|
|
|
# Parse args: separate slugs from flags
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--no-wait) no_wait=1 ;;
|
|
--build) build=1 ;;
|
|
-h|--help) usage_recreate; return 0 ;;
|
|
-*) die "Unknown option: $arg (see 'showcase recreate --help')" ;;
|
|
*) slugs+=("$arg") ;;
|
|
esac
|
|
done
|
|
|
|
[ ${#slugs[@]} -gt 0 ] || die "Usage: showcase recreate <slug> [slug...] [--build] [--no-wait]"
|
|
|
|
for slug in "${slugs[@]}"; do
|
|
need_slug "$slug"
|
|
|
|
# Pick the right compose file: aimock uses the test compose, everything
|
|
# else uses the main local compose.
|
|
local compose
|
|
if [ "$slug" = "aimock" ]; then
|
|
compose="$AIMOCK_COMPOSE"
|
|
else
|
|
compose="$COMPOSE_FILE"
|
|
fi
|
|
|
|
info "Force-recreating showcase-${slug} (picks up new image, unlike restart)..."
|
|
|
|
if [ "$build" -eq 1 ]; then
|
|
trap restore_symlinks EXIT
|
|
stage_shared
|
|
docker compose -f "$compose" up -d --build --force-recreate "$slug"
|
|
else
|
|
docker compose -f "$compose" up -d --force-recreate "$slug"
|
|
fi
|
|
|
|
if [ "$no_wait" -eq 0 ]; then
|
|
wait_healthy "$slug" 30
|
|
fi
|
|
|
|
# Print the image ID so the user can verify it changed
|
|
local container
|
|
container="$(slug_to_container "$slug")"
|
|
local image_id
|
|
image_id="$(docker inspect --format='{{.Image}}' "$container" 2>/dev/null || echo "unknown")"
|
|
# Truncate sha256:... to first 12 hex chars
|
|
image_id="${image_id#sha256:}"
|
|
image_id="${image_id:0:12}"
|
|
success "showcase-${slug} recreated — image: ${image_id}"
|
|
done
|
|
}
|