NetWorker: Docker container Backup client NetWorker fail with error savefs: fail

Summary: NetWorker: Docker container Backup client NetWorker fail 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

Клієнтське програмне забезпечення NetWorker встановлюється всередині docker-контейнера.
Клієнтське резервне копіювання docker-клієнта зазнає невдачі з такою помилкою:

<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

Клієнти NetWorker, які працюють у контейнерах Docker, офіційно не підтримуються в поточних релізах. Docker використовує файлову систему накладення і не використовує традиційне розташування диска, тому шляхи, такі як /etc/fstab, відсутні.

Resolution

Наразі немає підтримуваного способу резервного копіювання docker-контейнерів як клієнтів NetWorker. Якщо ви хочете, щоб ця функціональність існувала в NetWorker, зверніться до свого акаунта Dell або торгового представника щодо запиту на покращення (RFE).

 

Щоб запобігти резервному копіюванню даних Docker клієнтом NetWorker, потрібно використовувати директиви пропуску на клієнті NetWorker для структури файлів/папок Docker.

Приклад (модифікувати шляхи та процеси відповідно до вашої системи та конфігурації Docker):

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

Більше інформації про директиви NetWorker можна знайти в Керівництві з адміністрування NetWorker. Документація NetWorker доступна через: Підтримка NetWorker | Посібники та документи 

 

Щоб зробити резервне копіювання даних docker-контейнера, скористайтеся одним із наступних обхідних шляхів:

Обхідний шлях один: 

  1. Доступ до docker-хоста через SSH.
  2. З SSH-сесії підключайтеся до docker-контейнера. Точний синтаксис залежить від контейнерної платформи:
  • Docker: docker exec -it CONTAINER_NAME sh
  • Подман: podman exec -it CONTAINER_NAME sh
  1. Створіть fstab Файл за допомогою mtab Файл: cp /etc/mtab /etc/fstab
  2. Вийти з контейнера: exit
  3. Зробіть резервну копію контейнерного клієнта з NetWorker.

Другий обхідний шлях:

Створіть «архіви» даних контейнера Docker на хості Docker, зробите резервну копію даних як файлову систему збереження з цього хоста. Цей підхід може вимагати певного скриптування та використання cron Робота.

УВАГА: Підтримка NetWorker не надає підтримки скриптів або вирішення проблем із скриптами ОС. Наведений нижче приклад лише для доведення концепції. Скрипт пропонує загальні можливості налаштування і може задовольнити ваші потреби, але використовуйте його лише тоді, коли повністю розумієте його поведінку. Вам потрібно домовитися з системним адміністратором docker-хоста, щоб дізнатися, чи прийме він цей підхід. Співпрацюйте з системою та адміністратором Docker, щоб сформулювати відповідний скрипт для ваших потреб, використовуючи загальний огляд процедур, наведений тут. Підтримка NetWorker може допомогти лише з загальними питаннями резервного копіювання/відновлення NetWorker «архівних» тарболів, які мають резервні копії NetWorker.
  1. Створіть bash-скрипт, який виконує такі операції:
    1. Тимчасово зупини docker контейнер. Це зроблено для забезпечення узгодженості бази даних у контейнері docker.
    2. Запакуйте вміст папки docker-контейнера.
    3. Запусти docker-контейнер
    4. (за бажанням) архіви очищення старші за X днів.
#!/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

Або ж створіть cron job, щоб скрипт працював щодня, щотижня тощо (на свій розсуд),

[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm
[root@rhel-client01 scripts]#
ПРИМІТКА. Оскільки скрипт зупиняє docker-контейнер, важливо планувати архівний скрипт у часовий проміжок, прийнятний для тимчасового простою. Це необхідно координувати з адміністраторами системи та docker.
  1. Створіть клієнт NetWorker для системи, що розміщує docker-контейнери. «Save set» — це каталог, що використовується для каталогу, що містить архіви docker tarball:

Клієнт Docker

  1. Зробіть резервні копії клієнта. Посібник з адміністрування NetWorker надає більше інформації про створення політик резервного копіювання та планування. Документація NetWorker доступна через: Підтримка NetWorker | Посібники та документи 

Резервна копія клієнта містить дані 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
Дані зберігаються відповідно до періоду збереження, встановленого під час операції резервного копіювання.

Відновлення клієнта NetWorker використовується для відновлення tarball назад до існуючого (або альтернативного) клієнта NetWorker. Системний і докер-адміністратор повинен виконати наступні кроки для переналаштування docker-контейнера, використовуючи відновлені дані.

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.