Docs/Docker/backupContainer.sh
2025-03-19 14:01:38 +01:00

55 lines
2.5 KiB
Bash

#!/bin/bash
CONTAINER_NAME="$1"
BACKUP_DIR="$2"
VOLUME_NAME="$3"
if [ -z "$BACKUP_DIR" ]; then
echo "Usage: $0 <container_name> <backup_directory> <volume_name>"
exit 1
fi
if [ ! -d "$BACKUP_DIR" ]; then
echo "Directory $BACKUP_DIR does not exist"
exit 1
fi
#docker stop "$CONTAINER_NAME"
#docker commit "$CONTAINER_NAME" "${CONTAINER_NAME}_backup"
#docker save -o "$BACKUP_DIR/${CONTAINER_NAME}_backup.tar" "${CONTAINER_NAME}_backup"
#docker start "$CONTAINER_NAME"
#docker image rm -f "${CONTAINER_NAME}_backup"
# Backup volume
if [ "$VOLUME_NAME" ]; then
echo "Backup up volume $VOLUME_NAME"
docker run --rm -v "$VOLUME_NAME":/data -v "$BACKUP_DIR":/backup busybox tar czf /backup/"$VOLUME_NAME".tar.gz -C /data .
fi
# Extract image name
# IMAGE=$(docker inspect --format '{{.Config.Image}}' "$CONTAINER_NAME")
IMAGE="${CONTAINER_NAME}_backup"
# Extract ports
PORTS=$(docker inspect --format '{{json .HostConfig.PortBindings}}' "$CONTAINER_NAME" | jq -r 'to_entries | map("-p \(.value[0].HostPort):\(.key | sub("/tcp|/udp"; ""))") | join(" ")')
# Extract volumes
VOLUMES=$(docker inspect --format '{{json .Mounts}}' "$CONTAINER_NAME" | jq -r '.[] | select(.Type == "bind" or .Type == "volume") | "-v " + .Source + ":" + .Destination' | xargs)
# Extract environment variables
ENV_VARS=$(docker inspect --format '{{json .Config.Env}}' "$CONTAINER_NAME" | jq -r 'map("-e " + .) | join(" ")')
# Extract network mode
NETWORK_MODE=$(docker inspect --format '{{.HostConfig.NetworkMode}}' "$CONTAINER_NAME")
[ "$NETWORK_MODE" != "default" ] && NETWORK="--network=$NETWORK_MODE" || NETWORK=""
# Extract restart policy
RESTART_POLICY=$(docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' "$CONTAINER_NAME")
[ "$RESTART_POLICY" != "no" ] && RESTART="--restart=$RESTART_POLICY" || RESTART=""
# Extract privileged mode
PRIVILEGED=$(docker inspect --format '{{.HostConfig.Privileged}}' "$CONTAINER_NAME")
[ "$PRIVILEGED" == "true" ] && PRIV="--privileged" || PRIV=""
# Extract entrypoint (if set)
ENTRYPOINT=$(docker inspect --format '{{json .Config.Entrypoint}}' "$CONTAINER_NAME" | jq -r 'if . != null then "--entrypoint \"" + join(" ") + "\"" else "" end')
# Extract command (CMD)
CMD=$(docker inspect --format '{{json .Config.Cmd}}' "$CONTAINER_NAME" | jq -r 'if . != null then join(" ") else "" end')
# Construct final `docker run` command
RUN_COMMAND="docker run -d --name $CONTAINER_NAME $PORTS $VOLUMES $ENV_VARS $NETWORK $RESTART $PRIV $ENTRYPOINT $IMAGE $CMD"
# echo "$RUN_COMMAND"
echo "$RUN_COMMAND" > "$BACKUP_DIR/${CONTAINER_NAME}_deploy.sh"