#!/usr/bin/env bash # Build the API image on this workstation and import it into each lab node's # containerd. # # k3s does not run Docker and the lab has no registry, so images are shipped as # a stream: docker save -> ssh through the lab host -> k3s ctr images import. # Every node needs its own copy because the scheduler may place the pod anywhere. # # ./deploy/lab/scripts/build-and-import.sh # IMAGE=keycloak-pattern-api:lab NODES="kc-lab-1" ./deploy/lab/scripts/build-and-import.sh set -euo pipefail IMAGE="${IMAGE:-keycloak-pattern-api:lab}" NODES="${NODES:-kc-lab-1 kc-lab-2}" LAB_HOST="${LAB_HOST:-test-server}" CONTEXT="${CONTEXT:-backend}" repo_root="$(git rev-parse --show-toplevel)" cd "$repo_root" echo "==> building ${IMAGE} from ${CONTEXT}/" docker build -t "$IMAGE" "$CONTEXT" for node in $NODES; do echo "==> importing into ${node}" # Nested ssh: the workstation cannot reach the guests directly because they # sit behind the lab host's libvirt NAT. The lab host's ~/.ssh/config holds # the kc-lab-* aliases. docker save "$IMAGE" \ | ssh "$LAB_HOST" "ssh ${node} 'sudo k3s ctr images import -'" done echo "==> verifying" for node in $NODES; do printf ' %-10s ' "$node" ssh "$LAB_HOST" "ssh ${node} 'sudo k3s ctr images ls -q'" \ | grep -c "$IMAGE" \ | xargs -I{} echo "{} match(es)" done echo echo "next: kubectl rollout restart -n header-lab deployment/echo"