#!/usr/bin/env bash
# 容器镜像 -> /srv/mirror/images/<name>.tar.zst  (pull -> save -> zstd -> rmi 回收层空间)
# Tier A: 文档/代码显式钉死的镜像；Tier B: 从已拉取的 charts 渲染出的镜像。
set -uo pipefail
OUT=/srv/mirror/images
CHARTS=/srv/mirror/charts
mkdir -p "$OUT"
command -v zstd >/dev/null || sudo apt-get install -y -qq zstd >/dev/null 2>&1

saveimg(){ # image_ref
  local img="$1"
  local name; name=$(echo "$img" | sed 's#[/:]#_#g; s#@.*##')
  local tar="$OUT/$name.tar.zst"
  if [ -s "$tar" ]; then echo "[skip] $img (exists)"; return 0; fi
  echo "================ [img] $img  $(date +%H:%M:%S) ================"
  # 候选源: 原路径; bitnami 系 2025-08 后迁 bitnamilegacy(附录 D.4), 失败时回退
  local cands=("$img")
  case "$img" in *"/bitnami/"*) cands+=("$(echo "$img" | sed 's#/bitnami/#/bitnamilegacy/#')");; esac
  local got=""
  for cand in "${cands[@]}"; do
    [ "$cand" = "$img" ] || echo "  -> try legacy: $cand"
    local t=0
    while [ $t -lt 3 ]; do
      if sudo docker pull -q "$cand" >/dev/null 2>&1; then got="$cand"; break; fi
      t=$((t+1)); echo "  retry $t ($cand)"; sleep 4
    done
    [ -n "$got" ] && break
  done
  [ -z "$got" ] && { echo "  [FAIL pull] $img"; return 1; }
  [ "$got" = "$img" ] || sudo docker tag "$got" "$img"   # retag 回 chart 期望的 bitnami 名
  sudo docker save "$img" | zstd -T0 -3 -q -o "$tar" && sudo chown ecs-user:ecs-user "$tar"
  sha256sum "$tar" | sed "s#$OUT/##" > "$tar.sha256"
  echo "  [saved] $(du -h "$tar" | cut -f1)  $name"
  sudo docker rmi "$img" "$got" >/dev/null 2>&1 || true   # 回收 /var/lib/docker 层空间
}

echo "##### Tier A: 显式镜像 #####"
for img in \
  docker.io/vllm/vllm-openai:v0.11.0 \
  nvcr.io/nvidia/tritonserver:24.08-py3 \
  docker.io/nvidia/cuda:12.6.2-base-ubuntu22.04 \
  docker.io/oguzpastirmaci/gpu-burn:1.1 \
  docker.io/library/alpine:3.20 \
  docker.io/edenhill/kcat:1.7.1 \
  docker.io/minio/mc:RELEASE.2024-10-08T09-37-26Z ; do
  saveimg "$img"
done

echo "##### Tier B: charts 渲染镜像 #####"
imgs=$(for c in "$CHARTS"/*.tgz; do
         helm template r "$c" 2>/dev/null | grep -oE 'image: *"?[A-Za-z0-9./_-]+:[A-Za-z0-9._-]+' | sed 's/image: *"\?//';
       done | sort -u)
echo "$imgs" | sed 's/^/   render: /'
for img in $imgs; do saveimg "$img"; done

echo "=== images done ==="
ls -lh "$OUT"/*.tar.zst 2>/dev/null
echo "total: $(du -sh "$OUT" | cut -f1)"
