使用Python 3脚本自动化Harbor镜像复制

2023-09-15 15:22:28

介绍:

在容器化应用程序的世界中,Docker镜像是构建和部署的核心。许多组织使用Harbor作为他们的镜像仓库管理解决方案。但有时候,需要将镜像从一个Harbor仓库复制到另一个,这可能会是一个繁琐的任务。为了简化这个过程,我们将介绍如何使用Python脚本来自动化这个任务。这个脚本将从源Harbor仓库中复制镜像,并将其推送到目标Harbor仓库,同时保留标签和元数据。

脚本概览:

在这个部分,我们将简要介绍脚本的基本结构和功能。该脚本使用Python的subprocess模块执行Curl命令来与Harbor API进行通信,并处理返回的JSON数据。它还利用Docker命令来拉取、标记、推送和删除镜像。

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命令的输出解析为JSON
    try:
        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_name
            new_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}")
                        continue
                    
        except (json.JSONDecodeError) as e:
            logging.error(f"无法解析镜像 {repo_name} 的标签信息: {e}")
            continue

logging.info("镜像复制完成。")


配置和前提条件:

在运行脚本之前,您需要配置一些参数,包括源Harbor仓库的地址、凭据,以及目标Harbor仓库的地址和凭据。此外,确保您的系统上已经安装了docker和jq工具。

代码解释:

在这一部分,我们将详细解释脚本的每个部分,包括如何获取项目、镜像和标签信息,如何处理异常情况,以及如何执行Docker命令来操作镜像。

安全性注意事项:

由于涉及凭据和敏感信息,我们将讨论如何在脚本中安全处理这些信息,以防止泄漏。

使用示例:

我们将提供一个具体的示例,展示如何运行脚本以复制Harbor仓库中的镜像。示例还将包括示例命令和输出。

扩展和自定义:

如果您希望根据特定需求对脚本进行扩展或自定义,我们将提供一些建议和示例,以便您可以根据自己的需求进行修改。

总结:

最后,我们将总结脚本的优势和用途,强调自动化复制镜像的重要性,并鼓励读者在他们的工作中考虑使用这个脚本来简化镜像管理任务。

更多推荐

自身免疫疾病诊断原料厂家——博迈伦

自身免疫疾病是免疫系统异常攻击自身正常组织和器官的疾病,如类风湿性关节炎、系统性红斑狼疮、硬皮病等。诊断自身免疫疾病通常需要使用特定的试剂和试验方法。以下是一些常见的自身免疫疾病诊断原料厂家:1.ThermoFisherScientific(Invitrogen):作为一家的生命科学公司,ThermoFisherSci

Cglib代理和JDK代理原理的区别

一、JDKJdk动态代理,拿到目标类所实现的接口(目标类必须有实现接口),生成代理类,并且代理类也会实现和目标类一样的接口。二、CglibCglib代理功能更强,无论目标类是否实现了接口都可以代理,他是基于继承的方式来代理目标类,如果目标类也实现了接口,代理类也会实现一次publicObjectgetProxy(@Nu

大厂FPGA的面试题

FPGA(现场可编程门阵列)在电子工程领域被广泛使用,以下是一些FPGA面试题:解释FPGA,并列举其优点和局限。在FPGA上设计一个数字系统需要哪些步骤?FPGA设计中,时钟的使用和调整是个重要环节。你能解释一下什么是时钟抖动吗?在设计中如何处理这种问题?什么是时钟相位调整?这对于FPGA设计有何重要性?在FPGA设

我的创作纪念日(从本科到研究生)

一、机缘大一暑假的时候,老师让每周写自己学习了什么,然后以博客的形式记录下来,后来坚持的人很少,我也是其中之一,没有坚持下来。后来,有个同学经常分享自己学习成果,也就是把自己的博客发群,确实质量也不错,时间长了,他的粉丝什么的涨的就比较多,现在也是某一个领域的大佬了。我后来坚持发博客一方面受到了他的影响,另一方面我也在

【GIT问题解决】---- 在【.gitignore】中添加了忽略文件或文件夹后不生效

1.出现问题在已经提交过的GIT管理的项目中,在.gitignore文件中新增一些忽略的文件或者文件夹,或者直接新建.gitignore文件之后,新增的内容不生效。2.实例截图3.实例描述lifecycle.js文件已新增到.gitignore文件中,但是lifecycle.js文件修改的时候依然会上传;yarn.lo

LoRa 常见问题解答 FAQs汇总

目录LoRa调制和特点LoRaWAN协议LoRa网关如何选择LoRa的BW、SF和CR当两个不同制造商的SX127x模块不能相互通信,故障检测的步骤是什么可以用LoRa设备发送或接收一个无限长度的有效载荷数据包吗?文章部分来源LoRa调制和特点众所周知,无线通信基础的调制方式包括模拟调制AM(调幅)、FM(调频)和PM

Linux arm64 set_memory_ro/rw函数

文章目录一、函数简介1.1简介1.2change_memory_common1.3__change_memory_common二、apply_to_page_range函数2.1apply_to_page_range2.2apply_to_p4d_range2.3apply_to_pud_range2.4apply_t

InfluxDB时序数据库安装和使用

安装下载wgethttps://dl.influxdata.com/influxdb/releases/influxdb2-2.4.0-linux-amd64.tar.gz安装(没有/opt/module/目录的话先创建)tar-zxvfinfluxdb2-2.4.0-linux-amd64.tar.gz-C/opt/

ICA、TJA、ACC、ICC

原文链接1:https://www.dongchedi.com/article/7265878226768052772原文链接2:https://www.toutiao.com/article/7144570305288356367/?wid=1695348807250ICA,IntergratedCruiseAssi

电脑如何录屏?推荐3个方法

随着电脑技术的不断发展,屏幕录制成为了一项重要的技能,无论是为了制作教育教程、分享游戏成就,还是记录计算机上的重要操作。电脑录屏能够让您捕捉屏幕上的所有活动,这对于培训、演示和内容创作非常有用。在本文中,我们将向您介绍电脑如何录屏的3个方法,以帮助读者根据自己的需求选择最合适的录屏方式。电脑录屏软件1:专业录屏软件如果

2023研究生数学建模E题思路+模型+代码+论文(持续更新中) 出血性脑卒中临床智能诊疗建模

目录E题思路出血性脑卒中临床智能诊疗建模完整思路代码模型论文获取见文末名片完整思路代码模型论文获取见此E题思路出血性脑卒中临床智能诊疗建模完整思路代码模型论文获取见文末名片一、背景介绍出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血,占全部脑卒中发病率的10-15%。其病因复杂,通常因脑动脉瘤破裂、脑动脉异常等因素,

热文推荐