20. Dezember 2025

Backup per script für docker-container

ChatGPT-Image-Dec-20-2025-03_35_48-PM-1024x683 Backup per script für docker-container

Hej, heute mal was für die Docker-Container Enthusiasten.
Da ich mittlerweile doch schon einige Container am laufen habe und bekanntlich „Kein Backup, kein Mitleid“ ja schneller zuschlagen kann, als einem lieb ist, habe ich mit meinem Helferlein kurzgeschlossen und ein script gebastelt, womit man Docker-Container sicher herunterfährt, zippt und anschliessend per SFTP hochladen kann und es sendet per bedarf eine eMail bei erfolg, aber auch Fehler.

1. Schritt – Dazu muss vorher noch folgendes Installiert werden

apt install rsync zip sshpass mutt jq -y

2. Schritt – Das script erstellen

nano ./backup-docker.sh

Das script sieht so aus:

#!/bin/bash
set -euo pipefail

############################
# Parameter & Checks       #
############################

CONTAINER_NAME="${1:-}"

if [[ -z "$CONTAINER_NAME" ]]; then
    echo "Usage: $0 <container-name>"
    exit 1
fi

if ! docker inspect "$CONTAINER_NAME" >/dev/null 2>&1; then
    echo "ERROR: Container '$CONTAINER_NAME' not found!"
    exit 1
fi

############################
# Basis & Logging          #
############################

HOSTNAME=$(hostname)
DATE=$(date "+%Y-%m-%d")

BACKUP_DIR="/backups/docker"
LOG_DIR="/var/log/script-logs"
mkdir -p "$BACKUP_DIR" "$LOG_DIR"

ZIP_FILE="$BACKUP_DIR/${HOSTNAME}-${CONTAINER_NAME}-${DATE}.zip"
LOG_FILE="$LOG_DIR/docker-backup-${CONTAINER_NAME}.log"

exec > >(tee -a "$LOG_FILE") 2>&1

echo "===== Docker Backup gestartet ====="
echo "Container : $CONTAINER_NAME"
echo "Host      : $HOSTNAME"
echo "Datum     : $DATE"
echo

############################
# SFTP Config              #
############################

SFTP_SERVER="sftp.example.com"
SFTP_PORT="22"
SFTP_USER="sftp-user"
SFTP_PASS="password"
REMOTE_DIR="/uploads"

EMAIL="mail@example.com"

############################
# Mounts ermitteln         #
############################

mapfile -t MOUNTS < <(
    docker inspect "$CONTAINER_NAME" | jq -r '.[0].Mounts[].Source'
)

if [[ ${#MOUNTS[@]} -eq 0 ]]; then
    echo "ERROR: No mounts found for container $CONTAINER_NAME"
    exit 1
fi

echo "Mounts found:"
printf ' - %s\n' "${MOUNTS[@]}"
echo

############################
# Container stoppen        #
############################

echo "Stopping container $CONTAINER_NAME..."
docker stop "$CONTAINER_NAME" >/dev/null
sleep 5

############################
# Temp-Verzeichnis         #
############################

TMP_DIR="/tmp/docker-backup-$CONTAINER_NAME"
mkdir -p "$TMP_DIR"

echo "Copying mounts to temporary directory..."

for mount in "${MOUNTS[@]}"; do
    if [[ -d "$mount" ]]; then
        echo "  -> copying directory: $mount"
        rsync -a "$mount/" "$TMP_DIR/$(basename "$mount")/"
    else
        echo "  -> skipping non-directory mount: $mount"
    fi
done

############################
# ZIP erstellen            #
############################

echo
echo "Creating ZIP archive: $ZIP_FILE"
zip -r -v "$ZIP_FILE" "$TMP_DIR"
echo "ZIP successfully created."
echo

############################
# Container starten        #
############################

echo "Starting container $CONTAINER_NAME..."
docker start "$CONTAINER_NAME" >/dev/null
echo

############################
# Upload per SFTP          #
############################

echo "Uploading ZIP to SFTP server..."

sshpass -p "$SFTP_PASS" sftp -P "$SFTP_PORT" "$SFTP_USER@$SFTP_SERVER" << EOF
cd $REMOTE_DIR
put $ZIP_FILE
bye
EOF

echo "Upload completed."
echo

############################
# Cleanup                  #
############################

rm -rf "$TMP_DIR"
rm -f "$ZIP_FILE"

echo "Temporary data and local ZIP removed."
echo

############################
# Mail                     #
############################

echo "Docker-Backup für Container '$CONTAINER_NAME' auf $HOSTNAME erfolgreich abgeschlossen." \
| mutt -s "Docker-Backup $HOSTNAME:$CONTAINER_NAME erfolgreich" "$EMAIL"

echo "===== Backup abgeschlossen ====="

3. Schritt – Das script ausführbar machen

chmod +x ./backup-docker.sh

4. Schritt – Die wichtigsten Variablen müssen natürlich angepasst werden

SFTP_SERVER="hostname" # hostname des SFTP-Servers
SFTP_PORT="22" # Port
SFTP_USER="sftp-user" # SFTP-username
SFTP_PASS="password" # SFTP-Passwort
REMOTE_DIR="/uploads" # Pfad des Remote-SFTP-Servers wo die files gespeichert werden sollen
EMAIL="mail@exapmle.com" # an wen die eMail gesendet werden soll

Das war´s und nun viel Spaß mit Deinen Dockern und Backup.