快速批量备份docker镜像

在生产或测试环境中,我们有时候经常需要备份一些docker镜像,如果docker镜像有成千上百个,手动备份工作量就会很巨大,可以写一个备份脚本,实现批量自动备份。

需求:备份的文件名称需要以镜像名+标签方式命名

1.思路分析

我们可以根据下图分析备份方式

  • 绿框是镜像名称,有写镜像名称很长带着多级目录,我们可以通过awk取出最后一个字符串,最后一字符串一定是镜像名的唯一标识
  • 篮筐一列是镜像的版本号,通过awk取出,可以作为文件镜像备份的名称,例如nginx-latest.tar.gz
  • 红框中是镜像的ID号,我们备份的时候可以直接指定ID进行备份

在这里插入图片描述

当字段信息取出后,可以将取值命令定义成数组变量,然后通过for循环遍历数组,遍历后字段信息直接就可以互相关联,最终实现批量备份

2.命令实现

1)取出镜像名称

切记awk过滤字段后会把列名也带上,需要使用tail将其去掉

docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 |  awk '{print $3}'

2)取出镜像名称

docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 |  awk '{print $1}' | awk -F/ '{print $NF}'

3)取出标签

docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 | awk '{print $2}'

4)定义关联数组

declare image_id=(`docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 |  awk '{print $3}'`)
declare image_name=(`docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 |  awk '{print $1}' | awk -F/ '{print $NF}'`)
declare image_version=(`docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 | awk '{print $2}'`)

4)遍历数组

只需要遍历其中一个关联数组,获取数组索引值,就能对所有数组进行遍历,因为三个数组的索引数是一致的,且顺序也是一种,这样才能做到镜像名和标签名一一对应,实现批量备份

for i in ${!image_id[@]}
do
        docker save ${image_id[i]} > ${image_name[i]}_${image_version[i]}.tar.gz
done

3.整合脚本实现批量备份docker镜像

为了输出好看增加了字体颜色变量以及备份成功过后输出提示信息

#!/bin/bash
GREEN_COLOR='\e[032m'   #绿     
RED_COLOR='\e[031m'     #红
YELLOW_COLOR='\e[033m'  #黄
BLACK_COLOR='\e[0m'     #黑
declare image_id=(`docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 |  awk '{print $3}'`)
declare image_name=(`docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 |  awk '{print $1}' | awk -F/ '{print $NF}'`)
declare image_version=(`docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 | awk '{print $2}'`)
declare image_nameqc=(`docker images | grep -Ev '^k8s|^harbor|^rancher' | tail -20 |  awk '{print $1}'`)


for i in ${!image_id[@]}
do
        docker save ${image_id[i]} > ${image_name[i]}_${image_version[i]}.tar.gz
        if [ $? -eq 0 ];then
                echo -e "${YELLOW_COLOR}${image_id[i]} ${BLACK_COLOR} in ${YELLOW_COLOR} ${image_nameqc[i]} ${BLACK_COLOR} =====> ${GREEN_COLOR}back finish!!!${BLACK_COLOR} =====> back file is ${RED_COLOR} ${image_name[i]}_${image_version[i]}.tar.gz ${BLACK_COLOR}"
                echo ""
        fi
done

脚本执行后的输出

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐