快速批量备份docker镜像

举报
jiangxl 发表于 2022/04/14 00:02:07 2022/04/14
【摘要】 快速批量备份docker镜像 在生产或测试环境中,我们有时候经常需要备份一些docker镜像,如果docker镜像有成千上百个,手动备份工作量就会很巨大,可以写一个备份脚本,实现批量自动备份。 需求:...

快速批量备份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}'

  
 
  • 1

2)取出镜像名称

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

  
 
  • 1

3)取出标签

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

  
 
  • 1

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}'`)

  
 
  • 1
  • 2
  • 3

4)遍历数组

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

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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

脚本执行后的输出

在这里插入图片描述

文章来源: jiangxl.blog.csdn.net,作者:Jiangxl~,版权归原作者所有,如需转载,请联系作者。

原文链接:jiangxl.blog.csdn.net/article/details/116021628

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。