快速批量备份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
脚本执行后的输出