需求:运维帮助现场同事升级产品镜像
版本:harbor 2.4.X
docker 26.1.4
Centos7.X
以下是实现脚本:
备注:如果乌班图系统 使用bash 执行
使用说明:
1.#现场Harbor主机地址、 #现场登录Harbor的用户密码 这2个变量修改为现场的就可以使用。
2.使用时,把镜像打包后缀为 .tar 例如:nginx.tar 跟脚本放在同一个位置即可
原理:
就是在脚本所在的目录,扫码*.tar文件,加入数组,docker load 并上传harbor
#!/bin/bash
Harbor_Address=XXXX #现场Harbor主机地址
Harbor_User=admin #现场登录Harbor的用户
Harbor_Passwd=XXXXXX #现场登录Harbor的用户密码
declare -a Project
declare -a TAG_images
declare -a OLD_tag
Project=$(find ./ -name '*.tar'|xargs -i docker load -i {} |awk -F "/" '{print $2}'|sort |uniq)
TAG_images=($(find ./ -name '*.tar' | xargs -i docker load -i {} | awk -F "/" '{print $2"/"$3 "\n"}'))
OLD_tag=($(find ./ -name '*.tar'|xargs -i docker load -i {} |awk '{print $3 "\n"}'))
docker login -u admin -p $Harbor_Passwd $Harbor_Address >> /dev/null 2>&1
if [ $? -eq 0 ];then
echo "harbor登录成功"
sleep 2
else
echo "harbor登录失败,请检查harbor账号密码或harbor服务是否正常"
exit 10
fi
for i in $Project
do
curl -u "admin:$Harbor_Passwd" -X POST -H "Content-Type: application/json" "http://$Harbor_Address/api/v2.0/projects" -d "{\"project_name\": \"$i\", \"metadata\": {\"public\": \"true\"}, \"storage_limit\": -1}" >> /dev/null 2>&1
if [ $? -eq 0 ];then
echo "$i已经创建完成"
fi
done
#
#
#
echo "正在创建修改Harbor-tag"
sleep 2
#
len=${#OLD_tag[@]}
# 使用 for 循环遍历数组
for ((i=0; i<len; i++)); do
a=${OLD_tag[$i]}
b=${TAG_images[$i]}
# 重新标记镜像
docker tag "$a" "$Harbor_Address/$b"
# 检查命令状态
if [ $? -eq 0 ]; then
echo "$Harbor_Address/$b,已tag完成"
docker push $Harbor_Address/$b >> /dev/null 2>&1
if [ $? -eq 0 ];then
echo "$Harbor_Address/$b,已push完成,请在rancher上更新"
else
echo "$Harbor_Address/$b,push失败请查看"
fi
else
echo "$Harbor_Address/$b,tag失败请查看"
exit 11
fi
done
#