x
This commit is contained in:
94
swarm.sh
Executable file
94
swarm.sh
Executable 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"
|
||||
Reference in New Issue
Block a user