NetWorker: El respaldo del cliente de NetWorker del contenedor de Docker falla con el error savefs: fail
Summary: NetWorker: El respaldo del cliente de NetWorker del contenedor de Docker falla con el error savefs: fail
Symptoms
El software cliente de NetWorker se instala dentro de un contenedor Docker.
El respaldo basado en cliente del cliente Docker falla con el siguiente error:
<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
Actualmente, no hay ningún método compatible para respaldar contenedores Docker como clientes de NetWorker. Si desea que esta funcionalidad exista en NetWorker, comuníquese con su representante de cuentas o de ventas de Dell con respecto a una solicitud de mejora (RFE).
Para evitar que un cliente de NetWorker respalde datos de Docker, debe usar directivas de omisión en el cliente de NetWorker para la estructura de archivos/carpetas de Docker.
Ejemplo (modifique las rutas y los procesos según el sistema y la configuración de Docker):
<< /var/lib/docker >> skip: * << /var/lib/containers >> skip: * << /run >> skip: docker docker.sock containers podman crun
Encontrará más información sobre las directivas de NetWorker en la Guía de administración de NetWorker. La documentación de NetWorker está disponible a través de: Compatibilidad con NetWorker | Manuales y documentos
Para respaldar los datos del contenedor de Docker, utilice una de las siguientes soluciones alternativas:
Solución alternativa uno:
- Acceda al host de Docker a través de SSH.
- En la sesión de SSH, conéctese al contenedor de Docker. La sintaxis exacta utilizada depende de la plataforma del contenedor:
- Docker:
docker exec -it CONTAINER_NAME sh - Hombre de la vaina:
podman exec -it CONTAINER_NAME sh
- Cree un
fstabusando el archivomtabarchivo:cp /etc/mtab /etc/fstab - Salga del contenedor:
exit - Respalde el cliente de contenedor desde NetWorker.
Solución alternativa dos:
Cree "archivos" de los datos del contenedor de Docker en el host de Docker, respalde los datos como un saveset del sistema de archivos desde el host de Docker. Este enfoque puede requerir algunos scripts y el uso de cron puestos de trabajo.
- Cree un script bash que realice las siguientes operaciones:
- Detenga el contenedor de Docker temporalmente. Esto es para garantizar la coherencia de la base de datos en el contenedor Docker.
- Comprima el contenido de la carpeta del contenedor de Docker.
- Iniciar el contenedor Docker
- (opcional) limpie archivos de más de X días.
#!/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
Alternativamente, cree un trabajo cron para que el script se ejecute diariamente, semanalmente, etc. (según su discreción),
[root@rhel-client01 scripts]# ln -s /root/scripts/backup_npm.sh /etc/cron.daily/backup_npm [root@rhel-client01 scripts]#
- Cree un cliente de NetWorker para el sistema que aloja los contenedores de Docker. El "Saveset" es el directorio que se utiliza para el directorio que contiene los archivos tarball de Docker:

- Realice respaldos del cliente. En la Guía de administración de NetWorker , se proporciona más información sobre la creación de políticas de respaldo y la programación. La documentación de NetWorker está disponible a través de: Compatibilidad con NetWorker | Manuales y documentos
El respaldo del cliente contiene los datos de archivo comprimido de Docker:
[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
Se utiliza una restauración de cliente de NetWorker para recuperar el tarball en el cliente de NetWorker existente (o alternativo). El administrador del sistema y Docker debe realizar los pasos siguientes para volver a configurar el contenedor de Docker con los datos recuperados.