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

news/2025/10/1 10:17:13/文章来源:https://www.cnblogs.com/yongzhi/p/19122126

在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.mzph.cn/news/923739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站常用的优化方法有哪些做网站的策划需要做什么

1 二叉树的概念 二叉树是: 空树非空:根节点,根节点的左子树、根节点的右子树组成的。 二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。 2 二叉树的遍历 2.1 前序、中序以及后序遍历 学习二叉树结构&#xf…

动态分区分配算法

首次适应算法[first fit] 每次都从低地址开始查找,找到对歌能满足大小的空闲分区 空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链或表,找到大小能满足要求的第一个空闲分区 最佳适应算法[best fit…

上海殡葬一条龙服务权威推荐:寿衣、骨灰盒购买定制服务暖心陪伴与专业仪式之选

在生命的最后旅程中,一份专业、周到且充满人文关怀的殡葬服务,不仅是对逝者的尊重,更是对生者的慰藉。随着社会需求的不断提升,上海殡葬服务行业逐步走向规范化、专业化和人性化,各类服务机构不断优化服务流程,提…

百度建设自己的网站wordpress博客访问

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

potplayer截图

Potplayer播放器截图的方法: 在视频区域右击,选择“视频” -> “图像截取” -> “截存当前实画面”(快捷键:Ctrl+Alt+E)。

OpenAI发布提示词集

OpenAI发布提示词集OpenAI 发布“Prompt Packs”300+ 精选提示 Prompt12 个大类(IT、人力资源、销售、产品、客户服务……)每个角色 25 根据 KPI 和产品背景调整以获得最佳结果!https://academy.openai.com/public/…

做的网站需要什么技术支持中山网站建设文化咨询

jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务、管道及有jedis自身实现的分布式。在这里对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比:一、普通同步方式最简单和基础…

网站不备案能解析吗福州市做网站公司

之前有一个公司案例,是这样的: 公司名称:智慧科技有限公司 背景: 智慧科技有限公司是一家拥有数百名员工的中型企业,随着业务的快速发展,公司面临着网络管理上的挑战。 员工在日常工作中需要频繁地访问…

凯里网站制作做网站后期为什么续费

戳蓝字“CSDN云计算”关注我们哦!作者 | 张蓝予编辑 | 苏琦6月27日晚间,范冰冰李晨宣布分手,瞬间亿级的访问量,让微博再一次“崩溃”:范冰冰账号评论区无法加载,搜索“范冰冰李晨”显示失败。微博曾经夸下海…

从零开始学神经网络——CNN(卷积神经网络) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做视频点播网站如何赚钱东莞微信网站开发

学习了python基本数据类型,附学习笔记图及操作图 转载于:https://www.cnblogs.com/bgd140206127/p/6549229.html

营销导向企业网站策划wordpress 文章长度

项目应用场景 人体姿态估计是关于图像或视频中人体关节的 2D 或 3D 定位。一般来说,这个过程可以分为两个部分:(1) 2D 视频中的 2D 关键点检测;(2) 根据 2D 关键点进行 3D 位姿估计。这个项目使用 Detectron2 从任意的 2D 视频中检测 2D 关节…

公司网站建设公哈尔滨市住房和城乡建设局局网站

MiniGPT4系列之一部署篇:在RTX-3090 Ubuntu服务器部署步骤详解_seaside2003的博客-CSDN博客 MiniGPT4系列之二推理篇命令行方式:在RTX-3090 Ubuntu服务器推理详解_seaside2003的博客-CSDN博客 MiniGPT4系列之三模型推理 (Web UI):在RTX-309…

肇庆市企业网站建设品牌乐清市龙翔网络工程公司

目录 1. 引言 2. 人工智能的历史背景 3. 深度学习的崛起 3.1 深度神经网络的基本原理 4. 计算机视觉的发展现状 4.1 传统计算机视觉与深度学习的结合 5. 深度学习在计算机视觉中的应用 5.1 图像分类 5.2 目标检测 6. 深度学习引领的未来科技创新与变革 7. 结论 引言…

303、杂诗

303、杂诗303、杂诗 唐●无名氏 近寒食雨草萋萋,著麦苗风柳映堤。 等是有家归未得,杜鹃休向耳边啼。【现代诗意译】 临近寒食节 春雨绵绵 春草萋萋 春风吹拂麦苗 堤岸上柳丝依依多么美好的时节! 杜鹃啊,我们都是有…

【网络安全】四、中级篇:SQL注入详解 - 实践

【网络安全】四、中级篇:SQL注入详解 - 实践2025-10-01 09:54 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

完整教程:第三方软件测试公司:【Gatling基于Scala的开源高性能负载测试工具】

完整教程:第三方软件测试公司:【Gatling基于Scala的开源高性能负载测试工具】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

重庆做seo网站优化选择哪家全国小微企业名录

点击上方“蓝字”关注我们“2020中国山东新旧动能转换高价值专利培育大赛”(简称“新高赛”)是由山东省市场监督管理局(知识产权局)主办,由山东省知识产权事业发展中心、知识产权出版社有限责任公司共同承办的以新旧动能转换高价值专利培育为主题的创新大赛。新高赛…

网站名称意义灵璧县建设局网站

你是否曾经尝试过将你的 Python 程序打包成一个可执行文件,却发现生成的文件大得惊人?别担心,本文将教你如何使用 PyInstaller 尽可能减小生成的 onefile 大小,让你的程序轻盈如风! 1. 使用虚拟环境 首先&#xff0c…

完整教程:二维凸包——Andrew 算法学习笔记

完整教程:二维凸包——Andrew 算法学习笔记pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…