This commit is contained in:
2025-11-22 21:36:53 +00:00
parent e7979bc15c
commit 3edabc4d37

94
swarm.sh Executable file
View File

@@ -0,0 +1,94 @@
#!/usr/bin/env bash
set -euo pipefail
OUT_DIR=${1:-swarm-snapshot-$(date +%Y%m%d-%H%M%S)}
mkdir -p "$OUT_DIR"/{cluster,nodes,services,stacks,networks,volumes,configs,secrets}
echo "Writing snapshot to: $OUT_DIR"
########################
# Cluster-level info #
########################
docker info --format '{{json .}}' | jq '.' > "$OUT_DIR/cluster/docker-info.json"
docker info --format '{{json .Swarm}}' | jq '.' > "$OUT_DIR/cluster/swarm.json"
########################
# Nodes #
########################
docker node ls -q | while read -r id; do
echo "Node: $id"
docker node inspect "$id" | jq '.' > "$OUT_DIR/nodes/$id.json"
done
########################
# Services #
########################
docker service ls -q | while read -r id; do
name="$(docker service inspect --format '{{.Spec.Name}}' "$id")"
echo "Service: $name"
docker service inspect "$id" | jq '.' > "$OUT_DIR/services/${name}.json"
done
########################
# Stacks #
########################
for stack in $(docker stack ls --format '{{.Name}}'); do
echo "Stack: $stack"
mkdir -p "$OUT_DIR/stacks/$stack"
docker stack services "$stack" --format '{{json .}}' \
| jq -s '.' > "$OUT_DIR/stacks/$stack/services.json"
docker stack ps "$stack" --format '{{json .}}' \
| jq -s '.' > "$OUT_DIR/stacks/$stack/tasks.json"
# If available, this reconstructs the original compose-ish config
docker stack config "$stack" \
> "$OUT_DIR/stacks/$stack/stack-config.yml" 2>/dev/null || true
done
########################
# Networks #
########################
docker network ls --format '{{.ID}} {{.Name}}' \
| while read -r id name; do
echo "Network: $name"
docker network inspect "$id" | jq '.' > "$OUT_DIR/networks/${name}.json"
done
########################
# Volumes #
########################
docker volume ls --format '{{.Name}}' \
| while read -r vol; do
echo "Volume: $vol"
docker volume inspect "$vol" | jq '.' > "$OUT_DIR/volumes/${vol}.json"
done
########################
# Configs #
########################
docker config ls -q | while read -r id; do
name="$(docker config inspect --format '{{.Spec.Name}}' "$id")"
echo "Config: $name"
docker config inspect "$id" | jq '.' > "$OUT_DIR/configs/${name}.json"
done
########################
# Secrets (metadata) #
########################
docker secret ls -q | while read -r id; do
name="$(docker secret inspect --format '{{.Spec.Name}}' "$id")"
echo "Secret: $name (metadata only)"
docker secret inspect "$id" | jq '.' > "$OUT_DIR/secrets/${name}.json"
done
echo "Done. Snapshot in: $OUT_DIR"