一键打包所有docker镜像的脚本
若需批量将本地所有 Docker 镜像打包为 tar 文件,可以编写一个简单的脚本实现。以下是具体方案:
一键打包所有镜像的脚本
创建一个名为 docker-backup-all.sh
的脚本:
bash
#!/bin/bash# 确保以 root 权限运行
if [ "$(id -u)" -ne 0 ]; thenecho "请使用 sudo 运行此脚本"exit 1
fi# 创建备份目录(如果不存在)
BACKUP_DIR="$HOME/docker-images-backup/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"# 获取所有镜像列表(格式:仓库:标签)
IMAGES=$(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>")# 遍历镜像并打包
echo "开始打包镜像..."
for IMAGE in $IMAGES; do# 替换非法文件名的字符SAFE_NAME=$(echo "$IMAGE" | tr ':/' '_')TAR_FILE="$BACKUP_DIR/${SAFE_NAME}.tar"echo "正在打包: $IMAGE -> $TAR_FILE"docker save -o "$TAR_FILE" "$IMAGE"if [ $? -ne 0 ]; thenecho " 打包失败: $IMAGE" >&2else# 显示文件大小SIZE=$(du -h "$TAR_FILE" | cut -f1)echo " 已完成,大小: $SIZE"fi
doneecho "镜像打包完成!"
echo "备份文件保存在: $BACKUP_DIR"
使用方法
保存脚本:将上述代码保存为
docker-backup-all.sh
赋予执行权限:
bash
chmod +x docker-backup-all.sh
运行脚本:
bash
sudo ./docker-backup-all.sh
脚本输出:
plaintext
开始打包镜像... 正在打包: nginx:latest -> /root/docker-images-backup/20250730_1430/nginx_latest.tar已完成,大小: 133MB 正在打包: mysql:8.0 -> /root/docker-images-backup/20250730_1430/mysql_8.0.tar已完成,大小: 548MB 镜像打包完成! 备份文件保存在: /root/docker-images-backup/20250730_1430
脚本特点
- 自动命名:将
:
和/
替换为_
,避免文件名非法字符 - 时间戳目录:每个备份创建独立的时间戳目录,避免覆盖
- 错误处理:单个镜像失败不影响其他镜像打包
- 进度显示:实时显示打包进度和文件大小
恢复方法
若需恢复镜像,使用以下命令:
bash
docker load -i /path/to/your-image.tar
进阶优化(可选)
压缩选项:添加
gzip
压缩以减小文件体积:bash
docker save "$IMAGE" | gzip > "$TAR_FILE.gz"
排除特定镜像:在
grep
命令中添加过滤条件:bash
IMAGES=$(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>" | grep -v "mysql")
并行打包:使用
xargs
并行处理多个镜像(需注意系统资源):bash
echo "$IMAGES" | xargs -I {} -P 4 bash -c 'docker save -o "$HOME/docker-images-backup/$(date +%Y%m%d)/$(echo "{}" | tr ':/' '_').tar" "{}"'
这个脚本可以帮助你快速备份所有 Docker 镜像,适用于迁移环境、离线部署或灾难恢复场景。