#!/usr/bin/env bash set -euo pipefail # [DEF:scripts.build_offline_docker_bundle:Module] # @PURPOSE: Build and export an offline Docker bundle for enterprise-clean releases. # [/DEF:scripts.build_offline_docker_bundle:Module] SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" DIST_ROOT="${PROJECT_ROOT}/dist/docker" TAG="${1:-v1.0.0-rc2}" POSTGRES_IMAGE="${POSTGRES_IMAGE:-postgres:16-alpine}" BACKEND_IMAGE="ss-tools-backend:${TAG}" FRONTEND_IMAGE="ss-tools-frontend:${TAG}" get_image_id() { docker image inspect --format '{{.Id}}' "$1" } get_repo_digest() { local digest digest="$(docker image inspect --format '{{join .RepoDigests ","}}' "$1" 2>/dev/null || true)" if [[ -n "${digest}" && "${digest}" != "" ]]; then printf '%s' "${digest}" else printf '%s' "unavailable" fi } mkdir -p "${DIST_ROOT}" cd "${PROJECT_ROOT}" echo "[offline-bundle] building backend image ${BACKEND_IMAGE}" docker build -f docker/backend.Dockerfile -t "${BACKEND_IMAGE}" . echo "[offline-bundle] building frontend image ${FRONTEND_IMAGE}" docker build -f docker/frontend.Dockerfile -t "${FRONTEND_IMAGE}" . echo "[offline-bundle] pulling postgres image ${POSTGRES_IMAGE}" docker pull "${POSTGRES_IMAGE}" echo "[offline-bundle] exporting tar archives" docker save -o "${DIST_ROOT}/backend.${TAG}.tar" "${BACKEND_IMAGE}" docker save -o "${DIST_ROOT}/frontend.${TAG}.tar" "${FRONTEND_IMAGE}" docker save -o "${DIST_ROOT}/postgres.${TAG}.tar" "${POSTGRES_IMAGE}" echo "[offline-bundle] calculating checksums" ( cd "${DIST_ROOT}" sha256sum "backend.${TAG}.tar" "frontend.${TAG}.tar" "postgres.${TAG}.tar" > "sha256sums.${TAG}.txt" ) BACKEND_IMAGE_ID="$(get_image_id "${BACKEND_IMAGE}")" FRONTEND_IMAGE_ID="$(get_image_id "${FRONTEND_IMAGE}")" POSTGRES_IMAGE_ID="$(get_image_id "${POSTGRES_IMAGE}")" BACKEND_REPO_DIGEST="$(get_repo_digest "${BACKEND_IMAGE}")" FRONTEND_REPO_DIGEST="$(get_repo_digest "${FRONTEND_IMAGE}")" POSTGRES_REPO_DIGEST="$(get_repo_digest "${POSTGRES_IMAGE}")" cat > "${DIST_ROOT}/manifest.${TAG}.txt" < "${DIST_ROOT}/manifest.${TAG}.json" <