NetWorker : Docker container NetWorker client backup fails with error savefs : fail

Summary: NetWorker : Docker container NetWorker client backup fails with error savefs : fail

This article applies to This article does not apply to This article is not tied to any specific product. Not all product versions are identified in this article.

Symptoms

Le logiciel client NetWorker est installé dans un conteneur Docker.
La sauvegarde client du client Docker échoue avec l’erreur suivante :

<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

Les clients NetWorker qui s’exécutent dans des conteneurs Docker ne sont pas officiellement pris en charge dans les versions actuelles. Docker utilise un système de fichiers superposé et ne s’appuie pas sur une disposition de disque traditionnelle, de sorte que les chemins tels que /etc/fstab ne sont pas présents.

Resolution

Il n’existe actuellement aucune méthode prise en charge pour sauvegarder les conteneurs Docker en tant que clients NetWorker. Si vous souhaitez que cette fonctionnalité existe dans NetWorker, contactez votre responsable de compte ou agent commercial Dell concernant une demande d’amélioration (RFE).

 

Pour empêcher un client NetWorker de sauvegarder des données Docker, vous devez utiliser les directives skip sur le client NetWorker pour la structure de fichiers/dossiers Docker.

Exemple (modifiez les chemins d’accès et les processus en fonction de votre système et de la configuration de Docker) :

<< /var/lib/docker >>
skip: *
<< /var/lib/containers >>
skip: *
<< /run >>
skip: docker docker.sock containers podman crun

Pour plus d’informations sur les directives NetWorker, reportez-vous au NetWorker Administration Guide. La documentation NetWorker est disponible ici : Prise en charge de NetWorker | Manuels et documents 

 

Pour sauvegarder les données des conteneurs Docker, utilisez l’une des solutions de contournement suivantes :

Solution de contournement 1 : 

  1. Accédez à l’hôte Docker via SSH.
  2. À partir de la session SSH, connectez-vous au conteneur Docker. La syntaxe exacte utilisée dépend de la plateforme de conteneur :
  • Docker: docker exec -it CONTAINER_NAME sh
  • Podman : podman exec -it CONTAINER_NAME sh
  1. Créez un fstab à l’aide de l’attribut mtab fichier : cp /etc/mtab /etc/fstab
  2. Quittez le conteneur : exit
  3. Sauvegardez le client de conteneur à partir de NetWorker.

Solution de contournement 2 :

Créez des « archives » des données du conteneur Docker sur l’hôte Docker, sauvegardez les données en tant que saveset de système de fichiers à partir de l’hôte Docker. Cette approche peut nécessiter la rédaction de scripts et l’utilisation de cron Emplois.

AVERTISSEMENT : NetWorker ne prend pas en charge la rédaction de scripts ni les problèmes liés aux scripts du système d’exploitation. L’exemple ci-dessous est uniquement destiné à la preuve de concept. Le script offre des capacités générales de réglage et peut répondre à vos besoins, mais utilisez-le uniquement lorsque vous comprenez parfaitement son comportement. Vous devez vous coordonner avec l’administrateur système de l’hôte Docker pour voir s’il accepte cette approche. Collaborez avec l’administrateur système et Docker pour formuler un script adapté à vos besoins à l’aide de la présentation générale de la procédure décrite ici. Le support NetWorker peut uniquement vous aider à résoudre les problèmes généraux de sauvegarde/restauration NetWorker des archives sauvegardées par NetWorker.
  1. Créez un script bash qui effectue les opérations suivantes :
    1. Arrêtez temporairement le conteneur Docker. Cela permet d’assurer la cohérence de la base de données dans le conteneur Docker.
    2. Compressez le contenu du dossier du conteneur Docker.
    3. Démarrer le conteneur Docker
    4. (facultatif) nettoie les archives antérieures à X jours.
#!/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}"
Exemple d’utilisation de script :
[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

Vous pouvez également créer une tâche cron pour que le script s’exécute quotidiennement, hebdomadairement, etc. (à votre discrétion),

[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm
[root@rhel-client01 scripts]#
Remarque : Étant donné que le script arrête le conteneur Docker, il est important de planifier le script d’archivage pendant une période acceptable pour une interruption de service momentanée. Cela doit être coordonné avec les administrateurs système et Docker.
  1. Créez un client NetWorker pour le système hébergeant les conteneurs Docker. Le « Save set » est le répertoire utilisé pour le répertoire qui contient les archives docker tarball :

Client Docker

  1. Effectuez des sauvegardes du client. Le NetWorker Administration Guide fournit plus d’informations sur la création de règles et la planification des sauvegardes. La documentation NetWorker est disponible ici : Prise en charge de NetWorker | Manuels et documents 

La sauvegarde du client contient les données docker archive-tarball :

[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
Les données sont conservées conformément à la période de rétention définie dans l’action de sauvegarde.

Une restauration du client NetWorker est utilisée pour restaurer l’archive tarball sur le client NetWorker existant (ou un autre). L’administrateur système et Docker doit effectuer les étapes suivantes pour reconfigurer le conteneur Docker à l’aide des données récupérées.

Affected Products

NetWorker

Products

NetWorker
Article Properties
Article Number: 000071581
Article Type: Solution
Last Modified: 18 Apr 2026
Version:  8
Find answers to your questions from other Dell users
Support Services
Check if your device is covered by Support Services.