应用shell字典实现批量修改docker镜像名称并打包

问题引入

工作中需要将多个docker 仓库中的镜像修改名称之后,save到本地,save名称是与要获取的docker名称一一对应。
由于可能经常发布这些版本,为了较少执行时间,一劳永逸,故制作了这脚本。
通过脚本也学习了一些shell中的知识。直接上代码:

#!/bin/bash

# clear dir
rm -rf 'uca-v2.0.0-network-*'
# define dict name 'docker_images'
# 重点是下边的字典用法,key作为要修改后的docker名称和tag名称, value记录docker仓库中的镜像名称。
declare -A docker_images
docker_images=( ['network-api-service:20200307']='10.254.4.196:443/network-api' \
                ['network-core-service:20200305']='10.254.4.196:443/network-core' \
                )
# get keys,循环扩区镜像的key值
for name_tag in ${!docker_images[@]};
do
    echo "${name_tag}";
    image_name=${docker_images[${name_tag}]} # get value
    echo "${image_name}"

    # find the last image name, and get tag index,根据镜像名称过滤获取第一个镜像,因为默认是按照时间排序的,所以取第一即可
    tag=`docker images | grep $image_name | head -1| awk '{print $3}'`
    echo "${tag}"
    # rename tag
    echo `docker tag $tag $name_tag`
    # save name tag image,替换:为-,因为貌似tar中不能有:load会有问题。
    save_name=${name_tag//:/-}
    echo "${save_name}"
    save_name_tar=${save_name}'.tar'
    echo "${save_name_tar}"
    echo=`docker save -o $save_name_tar $name_tag`
    echo `ls -l | grep uca-v2.0.0-network-`
done

# scp push images to sever

有save就应该有load吧,顺便把load的代码也贴出来:


#!/bin/bash

declare -A docker_images
docker_images=( ['network-api-service:20200305']='network-api' \
                ['network-core-service:20200305']='network-core' \
                )
for name_tag in ${!docker_images[@]};
do
    echo "${name_tag}";
    # save name tag image
    save_name=${name_tag//:/-}
    echo "${save_name}"
    save_name_tar=${save_name}'.tar'
    echo "${save_name_tar}"
    echo `docker load -i $save_name_tar`
done

echo `docker images | grep netowrk`

yaml_list=( 'network-api.yaml' 'network-core.yaml' )

path=`dirname $0`
for yaml in ${yaml_list[@]};
do
    echo "${path}/${yaml}"
    echo `kubectl apply -f ${path}/${yaml}`
done

知识点总结

  • bash中字典的使用定义一个字典
    declare -A dict
  • 遍历字典的key
    for key in ${!dict[@]};do done
  • 遍历字典的value
    for value in ${dict[@]}; do done
  • 字符拼接,直接连个字符串并在一起即可,不要有空格
  • 获取第一行
    head -1

flag:
由于最近工作比较忙,好久的没更新设计模式的文章了,罪过罪过~下周一定写!

你可能感兴趣的:(bash,shell,docker)