流程图

代码示例

使用前需要登录 harbor

确保镜像的项目名在 harbor 中已存在

格式三类型的镜像会推送到 harbor 的 library 项目中

#!/bin/bash
# author: Amadeus Liu
# date: 2022-10-11 17:02:13
# version: 1.0

harbor_url="local.harbor.com"
log_file="/var/log/push-harbor.log"
image_id=$(docker images -q | sort -u)

ls ${log_file} || touch ${log_file}
echo "############# $(date "+%Y-%m-%d %H:%M:%S") #############" >> ${log_file}

get_image_tags () {
  docker inspect $1 --format='{{.RepoTags}}' | sed 's/\[//g' | sed 's/\]//g'
}

image_tag_and_push () {
  docker tag $1 $2 && echo "docker tag  $1 $2" >> ${log_file}
  docker push $2 && echo "docker pull $1 $2" >> ${log_file}
}

for i in ${image_id}; do
  # 判断镜像是否有harbor仓库的标签,有则视为harbor仓库中已有
  if [[  $(get_image_tags $i) =~ ${harbor_url} ]]; then
      echo "已有${harbor_url}仓库标签-----$(get_image_tags $i)"
    else
      # 镜像的第一个完整标签
      image_tag_first=$(echo $(get_image_tags $i) | awk -F' ' '{print $1}')
      # 镜像的第一个完整标签并去除版本
      image_tag_first_delete_ver=$(echo ${image_tag_first} | awk -F':' '{print $1}')
      
      # 判断标签属于哪种格式
      if [[ ${image_tag_first_delete_ver} =~ "/" ]]; then
        # 镜像的第一个完整标签的第一部分('/'分割后的$1)
        image_tag_first_repo=$(echo ${image_tag_first_delete_ver}| awk -F'/' '{print $1}')
        if [[ "${image_tag_first_repo}" =~ "." ]]; then
            # 格式一
            image_tag_harbor="${harbor_url}/$(echo ${image_tag_first} | awk -F'/' '{print $2}')/$(echo ${image_tag_first} | awk -F'/' '{print $3}')"
            echo "${image_tag_first} >>>>>tag to>>>>> ${image_tag_harbor}"
            image_tag_and_push $i ${image_tag_harbor}
          else
            # 格式二
            image_tag_harbor="${harbor_url}/${image_tag_first}"
            echo "${image_tag_first} >>>>>tag to>>>>> ${image_tag_harbor}"
            image_tag_and_push $i ${image_tag_harbor}
        fi
      else
        # 格式三
        image_tag_harbor="${harbor_url}/library/${image_tag_first}"
        echo "${image_tag_first} >>>>>tag to>>>>> ${image_tag_harbor}"
        image_tag_and_push $i ${image_tag_harbor}
      fi
  fi
done

腾讯云搬迁声明

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3ielzwnut2qsg

以上