harbor仓库镜像迁移脚本

import subprocess
import json
import logging# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 替换这里的Harbor仓库地址和凭据
harbor_url = "https://harbor.test.com"
harbor_name = "harbor.test.com"
username = "admin"
password = "Harbor12345"# 替换为新仓库的地址和凭据
new_harbor_url = "https://harbor.test.com"
new_harbor_name = "harbor.test.com"
new_harbor_pro = "test"
new_username = "admin"
new_password = "Harbor12345"# 执行Curl命令获取项目列表
try:curl_output = subprocess.check_output(f'curl --insecure -u "{username}:{password}" -X GET -H "Content-Type: application/json" {harbor_url}/api/v2.0/projects|jq', shell=True).decode('utf-8')
except subprocess.CalledProcessError as e:logging.error(f"获取项目列表时出错: {e}")exit(1)# 将Curl命令的输出解析为JSON
try:projects = json.loads(curl_output)
except json.JSONDecodeError as e:logging.error(f"无法解析JSON数据: {e}")exit(1)# 遍历项目列表
for project in projects:project_name = project["name"]# 执行Curl命令获取项目下的镜像列表try:curl_output = subprocess.check_output(f'curl --insecure -u "{username}:{password}" -X GET -H "Content-Type: application/json" {harbor_url}/api/v2.0/projects/{project_name}/repositories|jq', shell=True).decode('utf-8')except subprocess.CalledProcessError as e:logging.error(f"获取项目 {project_name} 的镜像列表时出错: {e}")continue# 将Curl命令的输出解析为JSONtry:repositories = json.loads(curl_output)except json.JSONDecodeError as e:logging.error(f"无法解析项目 {project_name} 的镜像列表: {e}")continue# 遍历镜像列表for repo in repositories:repo_name = repo["name"]repo_name_new_repo_name = repo_name.split("/", 1)if len(repo_name_new_repo_name) > 1:# 如果成功分割出两部分,repo_name_new_repo_name[1] 将包含第一个斜杠之后的部分new_repo_name = repo_name_new_repo_name[1]else:# 如果没有斜杠或只有一个斜杠,将保持原始 repo_namenew_repo_name = repo_name# 执行Curl命令获取镜像标签列表try:curl_output = subprocess.check_output(f'curl --insecure -u "{username}:{password}" -X GET -H "Content-Type: application/json" {harbor_url}/api/v2.0/projects/{project_name}/repositories/{new_repo_name}/artifacts', shell=True).decode('utf-8')except subprocess.CalledProcessError as e:logging.error(f"获取镜像 {repo_name} 标签列表时出错: {e}")continue# 提取标签信息try:artifacts = json.loads(curl_output)for image_info in artifacts:digest = image_info["digest"]tags = image_info["tags"]# 遍历每个标签并构建镜像地址for tag in tags:tag_name = tag["name"]source_image_url = f"{harbor_name}/{project_name}/{new_repo_name}:{tag_name}"new_image_url = f"{new_harbor_name}/{new_harbor_pro}/{new_repo_name}:{tag_name}"# 拉取源镜像try:subprocess.check_call(f'docker pull {source_image_url}',shell=True)except subprocess.CalledProcessError as e:logging.error(f"无法拉取镜像 {source_image_url}: {e}")continue# 标记新的镜像地址try:subprocess.check_call(f'docker tag {source_image_url} {new_image_url}',shell=True)except subprocess.CalledProcessError as e:logging.error(f"无法标记镜像 {new_image_url}: {e}")continue# 推送新镜像到新仓库try:subprocess.check_call(f'docker push {new_image_url}',shell=True)except subprocess.CalledProcessError as e:logging.error(f"无法推送镜像 {new_image_url}: {e}")continue# 删除本地源镜像try:subprocess.check_call(f'docker rmi {source_image_url}',shell=True)except subprocess.CalledProcessError as e:logging.error(f"无法删除本地镜像 {source_image_url}: {e}")continueexcept (json.JSONDecodeError) as e:logging.error(f"无法解析镜像 {repo_name} 的标签信息: {e}")continuelogging.info("镜像复制完成。")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《文存阅刊》期刊发表简介

《文存阅刊》以“深研文化创新,崇尚科学真理,坚持双百方针,打造学术精品”为办刊宗旨,涵盖艺术、文学、社科等多项内容,适应了文化市场需求,很好的回应了广大文化理论工作者的关切,为下一步打造…

ChatGPT新媒体运营神器:轻松驾驭内容创作与传播

文章目录 1. 内容创作2. 社交媒体管理3. 用户互动与客户服务 《巧用ChatGPT轻松玩转新媒体运营》内容简介作者简介目录前言/序言本书内容本书特色本书读者对象获取方式 随着互联网的高速发展,新媒体已经成为了人们获取信息、交流思想的重要渠道。在这个信息爆炸的时…

【SpringCache】快速入门 通俗易懂

1. 介绍 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如: EHCache Caffeine Redis(常用…

Centos7、Mysql8.0 load_file函数返回为空的终极解决方法--暨selinux的深入理解

零、问题背景 最近想换房,为了方便自己对比感兴趣的房子,因此决定将目标房源的基本信息放在表里,特别是要一目了然的看到众多房子的各种图纸和照片,因此决定要在Mysql8.0.34数据库中以二进制形式保存图片(抛开合理性和…

喝酒谁先倒

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮&…

Vue 2.0源码分析-update

Vue 的 _update 是实例的一个私有方法,它被调用的时机有 2 个,一个是首次渲染,一个是数据更新的时候;由于我们这一章节只分析首次渲染部分,数据更新部分会在之后分析响应式原理的时候涉及。_update 方法的作用是把 VNo…

思维链(CoT)提出者 Jason Wei:关于大语言模型的六个直觉

文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 Jason Wei 的主页:https://www.jasonwei.net/ Jason Wei,一位于 2020 年从达特茅斯学院毕业的杰出青年,随后加盟了…

大数据安全保障的四种关键技术

随着大数据时代的到来,数据安全保障的重要性日益凸显。大数据安全保障涉及多种关键技术,以下是四种关键技术的详细介绍。 数据加密技术 数据加密技术是大数据安全保障的核心技术之一。它通过将明文数据转化为密文数据,以保护数据的机密性和完…

CSS中 设置文字下划线 的几种方法

在网页设计和开发中,我们经常需要对文字进行样式设置,包括字体,颜色,大小等,其中,设置文字下划线是一种常见需求 一 、CSS种使用 text-decoration 属性来设置文字的装饰效果,包括下划线。 常用的取值&…

Visual Studio 2015 中 FFmpeg 开发环境的搭建

Visual Studio 2015 中 FFmpeg 开发环境的搭建 Visual Studio 2015 中 FFmpeg 开发环境的搭建新建控制台工程拷贝并配置 FFmpeg 开发文件测试FFmpeg 开发文件的下载链接 Visual Studio 2015 中 FFmpeg 开发环境的搭建 新建控制台工程 新建 Win32 控制台应用程序。 具体流程&…

炫酷不止一面:探索JavaScript动画的奇妙世界(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

proftpd安全加固:限制用户FTP登录

其实无所谓安全加固,因为proftp默认就是限制用户FTP登录的,这里有点凌乱得研究和实验了proftpd如何进行限制的,以及可能的放开限制。懂了这些才能更好的进行防护配置。 RootLogin指令其实主要作用就是启用ROOT访问。通常,proftpd在…

【Fastadmin】一个完整的轮播图功能示例

目录 1.效果展示: 列表 添加及编辑页面同 2.建表: 3.使用crud一键生成并创建控制器 4.html页面 add.html edit.html index.php 5.js页面 6.小知识点 1.效果展示: 列表 添加及编辑页面同 2.建表: 表名:fa_x…

【LabVIEW学习】5.数据通信之TCP协议,控制电脑的一种方式

一。tcp连接以及写数据(登录) 数据通信--》协议--》TCP 1.tcp连接 创建while循环,中间加入事件结构,创建tcp连接,写入IP地址与端口号 2.写入tcp数据 登录服务器除了要知道IP地址以及端口以外,需要用户名与密…

中通单号查询,中通快递物流查,备注需要的单号记录

批量查询中通快递单号的物流信息,并对需要的单号记录进行备注。 所需工具: 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,第一次使用的朋友记得先注册&#xff0c…

快速幂(C语言)

前言 快速幂算法一般用于高次幂取模的题目中,比如求3的10000次方对7取模。这时候有些同学会说:这还不简单?我直接调用pow函数然后对结果%7不得了么?可是3的10000次方这么庞大的数字,真的能储存在计算机里么&#xff1f…

HTML行内元素与块级元素的区别(超详细)

目录 行内元素&#x1f338;常见的行内元素&#x1f338;行内元素&#xff08;内联元素&#xff09;的特性 块级元素&#x1f338;常见的块级元素&#x1f338;块级元素的特性 相互转换(display)&#x1f338;行内块状元素的特性 行内元素 &#x1f338;常见的行内元素 <s…

c#学习相关系列之as和is的相关用法

一、子类和父类的关系 public class Program{static void Main(string[] args){Animal animal new Dog();// Dog dog (Dog)new Animal(); 编译成功&#xff0c;运行报错Dog dog (Dog)animal;Dog dog new Dog();Animal animal dog; //等价于Animal animal new Dog();}}pub…

java多生产者多消费者模拟实现

package com.example.springboottestone.main;import java.util.LinkedList; import java.util.Queue;/*** 多生产者多消费者模型是指多个生产者线程同时向缓冲区中添加数据&#xff0c;同时多个消费者线程从缓冲区中获取数据的并发模型。这种模型适用于需要高并发处理数据的场…

企业计算机服务器中了eking勒索病毒怎么办,eking勒索病毒解密数据恢复

随着计算机网络技术的不断发展与应用&#xff0c;企业的生产运营效率得到了极大提升&#xff0c;但网络安全威胁一直存在&#xff0c;网络威胁的技术也在不断更新&#xff0c;给企业的数据安全带来了严重威胁。在本月&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#…