NetWorker: Kopia zapasowa klienta kontenera Docker NetWorker kończy się niepowodzeniem z błędem savefs: fail
Summary: NetWorker: Kopia zapasowa klienta kontenera Docker NetWorker kończy się niepowodzeniem z błędem savefs: fail
Symptoms
Oprogramowanie klienckie NetWorker jest instalowane wewnątrz kontenera Docker.
Tworzenie kopii zapasowej klienta Docker opartej na kliencie kończy się niepowodzeniem z następującym błędem:
<client name>:savefs failed.
<client name>:savefs See the file '/nsr/logs/policy/<policy>/<workflow/backup_<jobid>_logs/<jobid>.log' for command output.
Stopped processing of the save set <cleint name>:<save set> because the savefs job job terminated with an error.
Job <jobid> host: <client name> savepoint: <save set> had ERROR indication(s) at completion
<client name>:<save set> abandoned.
Client '<client name>' is being skipped because no savesets of this client have been backed up as part of the backup action.
Action backup traditional 'backup' with job id <job id> is exiting with status 'failed', exit code 1
Cause
Resolution
Obecnie nie ma obsługiwanej metody tworzenia kopii zapasowych kontenerów Docker jako klientów NetWorker. Jeśli chcesz, aby ta funkcja istniała w NetWorker, skontaktuj się z przedstawicielem klienta lub handlowym firmy Dell w sprawie wniosku o ulepszenie (RFE).
Aby uniemożliwić klientowi NetWorker tworzenie kopii zapasowych danych platformy Docker, należy użyć dyrektyw pominięcia na kliencie NetWorker dla struktury plików/folderów platformy Docker.
Przykład (zmodyfikuj ścieżki i procesy zgodnie z konfiguracją systemu i platformy Docker):
<< /var/lib/docker >> skip: * << /var/lib/containers >> skip: * << /run >> skip: docker docker.sock containers podman crun
Więcej informacji na temat dyrektyw NetWorker znajduje się w Podręczniku administratora NetWorker. Dokumentacja NetWorker jest dostępna za pośrednictwem: Wsparcie dla NetWorker | Instrukcje obsługi i dokumenty
Aby utworzyć kopię zapasową danych kontenera platformy Docker, użyj jednego z następujących obejść:
Obejście pierwsze:
- Uzyskaj dostęp do hosta Docker przez SSH.
- Z poziomu sesji SSH połącz się z kontenerem platformy Docker. Dokładna stosowana składnia zależy od platformy kontenera:
- Oknie dokowanym:
docker exec -it CONTAINER_NAME sh - Podman:
podman exec -it CONTAINER_NAME sh
- Utwórz obiekt
fstabza pomocą plikumtabserwera NetWorker Management Console (NMC):cp /etc/mtab /etc/fstab - Wyjdź z kontenera:
exit - Utwórz kopię zapasową klienta kontenera z NetWorker.
Obejście drugie:
Utwórz "archiwum" danych kontenera Docker na hoście Docker, wykonaj kopię zapasową danych jako zestaw zapisu systemu plików z hosta Docker. Takie podejście może wymagać pewnych skryptów i użycia cron Zadania.
- Utwórz skrypt bash, który wykonuje następujące operacje:
- Tymczasowo zatrzymaj kontener Docker. Ma to na celu zapewnienie spójności bazy danych w kontenerze docker.
- Skompresuj zawartość folderu kontenera platformy Docker.
- Uruchamianie kontenera platformy Docker
- (opcjonalnie) oczyść archiwa starsze niż X dni.
#!/usr/bin/env bash
set -euo pipefail
# ===== Config (tunable) =====
CONTAINER_TOOL="podman" # container platform (podman or docker)
CONTAINER_NAME="npm" # the container name to verify after restart
COMPOSE_DIR="/root/docker/nginx" # directory containing docker-compose.yaml/podman-compose.yaml
BACKUP_ROOT="/root/docker/backups" # where backups are stored on the host
RETENTION_DAYS=3 # delete archives older than N days
TIMESTAMP="$(date +%F_%H%M%S)"
ARCHIVE="${BACKUP_ROOT}/${CONTAINER_NAME}-backup-${TIMESTAMP}.tar.gz"
LOCK_FILE="/var/lock/${CONTAINER_NAME}_backup.lock"
# ========================================
mkdir -p "$BACKUP_ROOT" /var/lock
# --- Handle stale lock files (if previous run crashed) ---
if [[ -f "$LOCK_FILE" ]]; then
# Try to find an owning process; if none, remove the stale lock
LOCK_FD_OWNER="$(lsof -t -- "$LOCK_FILE" 2>/dev/null || true)"
if [[ -z "$LOCK_FD_OWNER" || ! -d "/proc/$LOCK_FD_OWNER" ]]; then
echo "[INFO] Removing stale lock file: $LOCK_FILE"
rm -f "$LOCK_FILE"
fi
fi
# --- Simple lock to avoid overlapping runs ---
exec 9>"$LOCK_FILE"
if ! flock -n 9; then
echo "[INFO] Another backup is running. Exiting."
exit 0
fi
# --- Safety checks ---
if [[ ! -d "$COMPOSE_DIR" ]]; then
echo "[ERROR] Compose directory not found: $COMPOSE_DIR" >&2
exit 1
fi
if [[ ! -f "${COMPOSE_DIR}/docker-compose.yaml" && ! -f "${COMPOSE_DIR}/podman-compose.yaml" ]]; then
echo "[ERROR] No compose file found in ${COMPOSE_DIR}" >&2
exit 1
fi
# --- Functions ---
prune_backups() {
local root="$1" days="$2"
echo "[INFO] Pruning backups older than ${days} days in ${root}..."
find "$root" -maxdepth 1 -type f -name "${CONTAINER_NAME}-backup-*.tar.gz" -mtime +"$days" -print -delete || true
}
verify_running() {
# Expect container named "${CONTAINER_NAME}" to be running again
if ${CONTAINER_TOOL} ps --format '{{.Names}}' | grep -qx "${CONTAINER_NAME}"; then
echo "[INFO] Container '${CONTAINER_NAME}' is running."
else
echo "[WARN] Container '${CONTAINER_NAME}' not found in '${CONTAINER_TOOL} ps'. Check '${CONTAINER_TOOL} ps -a' and logs."
fi
}
# --- Stop stack cleanly using *-compose in its directory ---
echo "[INFO] Bringing down stack (${CONTAINER_TOOL}-compose down) in ${COMPOSE_DIR}..."
(
cd "$COMPOSE_DIR"
# Do NOT pass -p; let the project default to the directory name
${CONTAINER_TOOL}-compose down || {
echo "[WARN] ${CONTAINER_TOOL}-compose down returned non-zero. Continuing (stack may not have been up)."
}
)
# --- Create archive (compose dir: data, letsencrypt, compose file, etc.) ---
echo "[INFO] Archiving ${COMPOSE_DIR} to ${ARCHIVE}..."
# Preserve SELinux/xattrs and ownership; exclude the backups dir if it's under same parent
tar -C "$(dirname "$COMPOSE_DIR")" \
--xattrs --selinux --same-owner --numeric-owner \
--exclude "$(basename "$BACKUP_ROOT")" \
-czf "$ARCHIVE" "$(basename "$COMPOSE_DIR")"
# Optional integrity checksum
sha256sum "$ARCHIVE" > "${ARCHIVE}.sha256"
# --- Start stack back up ---
echo "[INFO] Starting stack (${CONTAINER_TOOL}-compose up -d)..."
(
cd "$COMPOSE_DIR"
${CONTAINER_TOOL}-compose up -d
)
# --- Verify expected container is running ---
verify_running
# --- Prune according to retention ---
prune_backups "$BACKUP_ROOT" "$RETENTION_DAYS"
echo "[OK] Backup completed: ${ARCHIVE}"
[root@rhel-client01 scripts]# ./backup_npm.sh [INFO] Removing stale lock file: /var/lock/npm_backup.lock [INFO] Bringing down stack (podman-compose down) in /root/docker/nginx... npm npm 14dc3c3871a7a9716142a1011f1039258d330be1ddb49543eb7a8e257256239a nginx_default [INFO] Archiving /root/docker/nginx to /root/docker/backups/npm-backup-2026-02-10_155107.tar.gz... [INFO] Starting stack (podman-compose up -d)... be491bf43aa17f1a767075ed8b2cd55d93cdf4581ad04abe66a58f3bce0b5e74 e677dbedd5fdd92a440896dc4cae22165cb34ce704ec3ed8f7620ce243183585 npm [INFO] Container 'npm' is running. [INFO] Pruning backups older than 3 days in /root/docker/backups... [OK] Backup completed: /root/docker/backups/npm-backup-2026-02-10_155107.tar.gz [root@rhel-client01 scripts]# [root@rhel-client01 scripts]# ls -ltr /root/docker/backups/ total 8 -rw-r--r--. 1 root root 638 Feb 10 15:51 npm-backup-2026-02-10_155107.tar.gz -rw-r--r--. 1 root root 123 Feb 10 15:51 npm-backup-2026-02-10_155107.tar.gz.sha256
Alternatywnie utwórz zadanie cron, aby skrypt działał codziennie, co tydzień i tak dalej (według własnego uznania),
[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm [root@rhel-client01 scripts]#
- Utwórz klienta NetWorker dla systemu hostującego kontenery Docker. "Save set" jest katalogiem używanym do katalogu, który zawiera archiwa archiwum archiwum docker:

- Wykonaj kopie zapasowe klienta. Więcej informacji na temat tworzenia zasad tworzenia kopii zapasowych i planowania można znaleźć w Podręczniku administracyjnym NetWorker . Dokumentacja NetWorker jest dostępna za pośrednictwem: Wsparcie dla NetWorker | Instrukcje obsługi i dokumenty
Kopia zapasowa klienta zawiera dane archiwum dockera:
[root@nsr ~]# mminfo -avot -q client=rhel-client01.amer.lan -r "nsavetime,savetime(20),name,sumflags,ssretent" save time date time name fl retent ... 1770757763 02/10/2026 16:09 /root/docker/backups cb 03/10/2026 [root@nsr ~]# nsrinfo -t 1770757763 rhel-client01.amer.lan scanning client `rhel-client01.amer.lan' for savetime 1770757763(Tue 10 Feb 2026 04:09:23 PM EST) from the backup namespace /root/docker/backups/npm-backup-2026-02-10_155107.tar.gz /root/docker/backups/npm-backup-2026-02-10_155107.tar.gz.sha256 /root/docker/backups/ /root/docker/ /root/ / 6 objects found
Przywracanie klienta NetWorker służy do odzyskania archiwum tar z powrotem do istniejącego (lub alternatywnego) klienta NetWorker. Administrator systemu i dockera musi wykonać kolejne kroki, aby ponownie skonfigurować kontener docker przy użyciu odzyskanych danych.