## Requirements
- jq
- docker-machine
## Usage
```dockup.sh instance stack```
## Code
```shell
#!/bin/bash
# Directory to save the backup on the remote server
REMOTE_BACKUP_DIR="/tmp"
# Directory to save the backup on the local machine
LOCAL_BACKUP_DIR="./"
# Instance name in docker-machine
INSTANCE_NAME="$1"
# Stack name in your Docker Swarm
STACK_NAME="$2"
eval $(docker-machine env ${INSTANCE_NAME})
# Docker volumes directory
DOCKER_ROOT_DIR=$(docker info --format '{{.DockerRootDir}}')
DOCKER_VOLUME_DIR="${DOCKER_ROOT_DIR}/volumes"
# Find all services in the stack
SERVICES=$(docker stack services ${STACK_NAME} --format '{{.Name}}')
# Create instance directory
mkdir -p ${INSTANCE_NAME}
echo "$SERVICES"
# Iterate over all services
for SERVICE in $SERVICES
do
echo "Backing up service: ${SERVICE}"
# Find all volumes of the service
VOLUMES=$(docker service inspect ${SERVICE} --format '{{ json .Spec.TaskTemplate.ContainerSpec.Mounts }}' | jq -r '.[] | select(.Type == "volume") | .Source')
# Iterate over each volume and backup
for VOLUME in $VOLUMES
do
echo "Backing up volume: ${VOLUME}"
# Create a backup filename
REMOTE_BACKUP_FILE="${REMOTE_BACKUP_DIR}/${SERVICE}_${VOLUME}_$(date +%Y%m%d%H%M%S).tar.gz"
LOCAL_BACKUP_FILE="${LOCAL_BACKUP_DIR}/${INSTANCE_NAME}/${SERVICE}_${VOLUME}_$(date +%Y%m%d%H%M%S).tar.gz"
# Use docker run to start a temporary container with the volume attached, and create a tar.gz file of the volume's contents
docker-machine ssh ${INSTANCE_NAME} "docker run --rm -v ${DOCKER_VOLUME_DIR}/${VOLUME}/_data:/volume alpine tar czf - -C /volume . > ${REMOTE_BACKUP_FILE}"
# Transfer the backup file to the local machine
docker-machine scp ${INSTANCE_NAME}:${REMOTE_BACKUP_FILE} ${LOCAL_BACKUP_FILE}
done
done
```