当前位置: 首页 > news >正文

OpenWRT中备份多个docker容器的脚本 -

在OpenWrt 24.10.1上测试通过

#!/bin/sh
# OpenWrt Docker Container Backup Script
# Backup docker container and copy to network storageecho "=========================================="
echo "Docker Container Backup Script Starting"
echo "=========================================="# Configuration parameters
DOCKER_CONTAINERS=(my-postgres my-redis my-nginx)  # 这里填写需要备份的容器名,可以是多个
BACKUP_DIR="/root/docker_backup"
NAS_PATH="//192.168.0.20/backup" # NAS共享路径
NAS_USERNAME="your_username"   # NAS用户名
NAS_PASSWORD="your_password"   # NAS密码
MOUNT_POINT="/mnt/post"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
RETENTION_DAYS=7  # Keep backups for 7 days, delete older ones# Check if running as root
if [ "$(id -u)" -ne 0 ]; thenecho "[FATAL] This script must be run as root!"echo "Please run with: sudo $0"exit 1
fi# Check docker
if ! command -v docker >/dev/null 2>&1; thenecho "[FATAL] Docker command not found! Please install docker first."exit 1
fi# Check rsync
if ! command -v rsync >/dev/null 2>&1; thenecho "[FATAL] rsync command not found! Please install rsync first."exit 1
fi# Check mount command
if ! command -v mount >/dev/null 2>&1; thenecho "[FATAL] mount command not found!"exit 1
fi# Check gzip
if ! command -v gzip >/dev/null 2>&1; thenecho "[FATAL] gzip command not found! Please install gzip first."exit 1
fi# Check CIFS kernel module
echo "[INFO] Checking CIFS kernel module (kmod-fs-cifs)..."
if opkg list-installed | grep "kmod-fs-cifs"; thenecho "[SUCCESS] kmod-fs-cifs is installed."
elif opkg list | grep "kmod-fs-cifs"; thenecho "[INFO] Installing kmod-fs-cifs..."opkg updateopkg install kmod-fs-cifsif [ $? -eq 0 ]; thenecho "[SUCCESS] kmod-fs-cifs installed successfully."elseecho "[FATAL] Failed to install kmod-fs-cifs. CIFS mounting will not work."exit 1fi
elseecho "[FATAL] kmod-fs-cifs package not found in repositories."echo "CIFS mounting requires this kernel module. Please install it manually."exit 1
fi# 检查所有容器是否存在
for CONTAINER_NAME in "${DOCKER_CONTAINERS[@]}"; doCONTAINER_ID=$(docker ps -qf "name=$CONTAINER_NAME")if [ -z "$CONTAINER_ID" ]; thenecho "[FATAL] No Docker container named '$CONTAINER_NAME' is running!"echo "Please start the container first or check the container name."exit 1fiecho "[INFO] Docker container found: $CONTAINER_NAME"
done# Function to check if mount point is mounted
check_mount() {if grep -q "$MOUNT_POINT" /proc/mounts; thenreturn 0fiif mount | grep -q "$MOUNT_POINT"; thenreturn 0fiif [ -d "$MOUNT_POINT" ] && [ "$(ls -A "$MOUNT_POINT" 2>/dev/null)" ]; thenreturn 0fireturn 1
}# Check if mount is successful
if ! check_mount; thenecho "[INFO] NAS not mounted, attempting to mount..."mkdir -p "$MOUNT_POINT"mount -t cifs -o username="$NAS_USERNAME",password="$NAS_PASSWORD" "$NAS_PATH" "$MOUNT_POINT"sleep 2if ! check_mount; thenecho "[FATAL] NAS mount failed, aborting backup."exit 1fiecho "[SUCCESS] NAS mounted successfully."
elseecho "[INFO] NAS is already mounted."
fi# Create backup directory
mkdir -p "$BACKUP_DIR"
if [ $? -ne 0 ]; thenecho "[FATAL] Failed to create backup directory."exit 1
fi# 循环备份每个容器
for CONTAINER_NAME in "${DOCKER_CONTAINERS[@]}"; doBACKUP_FILENAME="${CONTAINER_NAME}_bak_${TIMESTAMP}.tar.gz"BACKUP_PATH="${BACKUP_DIR}/${BACKUP_FILENAME}"echo "[INFO] Backing up container: $CONTAINER_NAME"docker export "$(docker ps -qf "name=$CONTAINER_NAME")" | gzip > "$BACKUP_PATH"if [ $? -ne 0 ]; thenecho "[ERROR] Backup failed for container: $CONTAINER_NAME"exit 2fiecho "[SUCCESS] Backup completed: $BACKUP_FILENAME"rsync -av "$BACKUP_PATH" "$MOUNT_POINT/"if [ $? -ne 0 ]; thenecho "[ERROR] Failed to copy backup to NAS for container: $CONTAINER_NAME"exit 3fiecho "[INFO] Cleaning up old backups for container: $CONTAINER_NAME"find "$BACKUP_DIR" -name "${CONTAINER_NAME}_bak_*.tar.gz" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;find "$MOUNT_POINT" -name "${CONTAINER_NAME}_bak_*.tar.gz" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;echo "[SUCCESS] Cleanup completed for container: $CONTAINER_NAME"
doneecho "[SUCCESS] All backups and cleanups completed!"
http://www.hskmm.com/?act=detail&tid=22073

相关文章:

  • 动态分区分配算法
  • 上海殡葬一条龙服务权威推荐:寿衣、骨灰盒购买定制服务暖心陪伴与专业仪式之选
  • potplayer截图
  • OpenAI发布提示词集
  • 303、杂诗
  • 完整教程:第三方软件测试公司:【Gatling基于Scala的开源高性能负载测试工具】
  • 微信小程序开发 - MrFlySand
  • 电脑性能优化综合指南:从网络到硬件的不全面解答
  • 连续分配管理方式
  • 验证码破解:机器学习辅助电商爬虫 - 教程
  • 【光照】[PBR][几何遮蔽]实现方法对比
  • 完整教程:C++设计模式之结构型模式:适配器模式(Adapter)
  • 网页访问速度很慢,远程仓库调用很慢
  • 深入解析:【项目】Vision Master OpenCV 3.0 版本(预)发行说明
  • 2025木方厂家权威推荐榜:实力工厂与优质供应之选
  • 10 月做题记录
  • LoRa/LoRaWAN技术手册
  • 便宜的 VPS
  • 2025南通宠物医院权威推荐榜:专业诊疗与暖心服务口碑之选
  • 【JavaScript 性能优化实战】第六篇:性能监控与自动化优化 - 指南
  • linux 系统cshrc 资料
  • 2025 年西安品质楼盘住宅推荐排行榜权威发布,精选优质楼盘推荐
  • 某商业银行项目管理建设演进报告 - 指南
  • 题解:P14073 [GESP202509 五级] 数字选取
  • 2025西安新房住宅推荐排行榜发布,房屋品质、周边配套、交通便利性多维度选择指南!
  • 华为造车“内战”!徐直军下场做“启境”,会比余承东五界更强?
  • 余承东的新职位传递了华为重大信息
  • 张雪峰的事儿,大有文章
  • 词(持续更新)语言的边界就是
  • 财务分析怎么做 - 智慧园区