95 lines
2.6 KiB
Bash
Executable File
95 lines
2.6 KiB
Bash
Executable File
#!/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"
|