可通过shell脚本配合cron自动导出docker镜像为带时间戳的.tar备份;需指定镜像名+标签白名单,跳过悬空镜像,按日期建目录、逐个导出并记录日志,每日清理7天前备份,校验完整性并可选压缩与远程归档。

可以通过 shell 脚本配合 cron 定时任务,自动导出本地 Docker 镜像为 .tar 文件并保存带时间戳的备份。
确认要备份的镜像列表
脚本需明确指定哪些镜像需要导出,避免全量导出浪费空间。推荐使用镜像名+标签(如 nginx:alpine)而非 ID,更易维护。
- 用
docker images --format "{{.Repository}}:{{.Tag}}"获取所有带标签的镜像 - 或固定写入白名单数组:
IMAGES=("redis:7-alpine" "mysql:8.0" "myapp:v2.1") - 跳过
<none></none>悬空镜像(无仓库名/标签),防止导出无效镜像
构建导出脚本(含时间戳与目录管理)
脚本需创建按日期组织的备份目录,为每个镜像生成独立 tar 包,并记录导出日志。
- 用
$(date +\%Y-\%m-\%d_\%H-\%M)生成精确到分钟的时间戳 - 导出命令示例:
docker save -o "/backup/2024-05-20/nginx_alpine_2024-05-20_14-30.tar" nginx:alpine - 每次运行前清理 7 天前的旧备份:
find /backup -name "*.tar" -mtime +7 -delete - 检查导出是否成功:
if [ $? -eq 0 ]; then echo "[OK] $img"; else echo "[FAIL] $img"; fi
配置 cron 实现定时执行
将脚本加入系统级或用户级定时任务,确保环境变量(如 PATH 和 DOCKER_HOST)可用。
- 编辑 crontab:
crontab -e - 添加行(每天凌晨 2 点执行):
0 2 * * * /bin/bash /opt/docker-backup/save-images.sh >> /var/log/docker-backup.log 2>&1 - 注意:cron 默认 PATH 较窄,建议在脚本开头显式声明:
export PATH="/usr/local/bin:/usr/bin:/bin" - 若 Docker daemon 需 socket 权限,确保运行 cron 的用户属于
docker组
验证与轻量归档(可选)
导出后可校验 tar 文件完整性,并压缩节省空间(尤其镜像较大时)。
- 快速校验:
tar -tf "$backup_file" >/dev/null && echo "Valid" - 启用 gzip 压缩(加
-z参数):docker save "$img" | gzip > "$backup_file.gz" - 记录镜像元信息:
docker inspect "$img" > "${backup_file%.tar}.json" - 推送至远程存储(如 rsync 到 NAS 或 aws s3 cp)可进一步增强可靠性
不复杂但容易忽略细节:路径权限、cron 环境差异、镜像命名一致性。跑通一次后,就能长期静默运行。











