1. 用于批量下载某个仓库中的所有镜像
  2. 用于批量下载所有仓库中的所有镜像
import requests
import subprocess

# 配置Harbor连接参数
harbor_url = "http://harbor.inner.ai.kingsoft.com:11180"
username = "admin"
password = "Harbor123.com!"

# 认证会话
session = requests.Session()
session.auth = (username, password)


def get_project_image(target_project):
    # 步骤1:获取项目下的仓库列表
    search_url = f"{harbor_url}/api/search"
    params = {"q": target_project}
    response = session.get(search_url, params=params)

    if response.status_code != 200:
        raise Exception(f"查询仓库失败,状态码:{response.status_code}")
    repositories = [repo["repository_name"]
                    for repo in response.json().get("repository", [])
                    if repo.get("project_name") == target_project]
    # 步骤2:遍历仓库获取镜像标签
    harbor_addr = harbor_url.split('/')[2]
    images_list = []
    for repo in repositories:
        tags_url = f"{harbor_url}/api/repositories/{repo}/tags"
        tags_response = session.get(tags_url)
        for tag in tags_response.json():
            if tags_response.status_code == 200:

                images_list.append(f"{harbor_addr}/{repo}:{tag['name']}")

            else:
                print(f"获取仓库 {repo} 的标签失败,状态码:{tags_response.status_code}")
    return images_list


def get_project_all():
    projects_url = f"{harbor_url}/api/projects"
    response = session.get(projects_url)
    images_list = []
    for project in response.json():
        project_name = project['name']
        images_list += get_project_image(project_name)
    return images_list


def download_image(image_str):
    # TODO 这里可以使用subprocess模块下载并保存镜像到本地
    package_name = image_str.split("/")[-1].split(":")[0]
    tag = image_str.split("/")[-1].split(":")[-1]
    subprocess.run(["docker", "pull", image_str], stdout=subprocess.DEVNULL)
    subprocess.run(["docker", "save", "-o", f"{package_name}_{tag}.tar", image_str])
    with open("./image.txt", "a", encoding='utf-8') as f:
        f.write(f"{image_str}\n")
    print(f"成功下载镜像:{image_str}")
    


def main(target_projects=None, project_all=None):
    if project_all:
        return get_project_all()
    else:
        images_list = []
        for target_project in target_projects:
            images_list += get_project_image(target_project)
        return images_list

def message(webhook_url):
    
    headers = {'Content-Type': 'application/json'}
    message = {
        "msgtype": "markdown",
        "markdown": {
            "text": "## 镜像备份完了!!!!"
        }
    }
    ret = requests.post(webhook_url, headers=headers, json=message)
    print(ret.text)



if __name__ == '__main__':
    target_projects = ["hanhai-evaluation","hanhai-kas","kai"]
    webhook_url = ""
    # 1. 获取所有仓库所有镜像
    # images_list = main(project_all=True)
    # 2. 获取指定仓库所有镜像
    images_list = main(target_projects)
    print(images_list)
    # TODO 这里可以循环一下这个列表,调用subprocess模块进行下载和保存到本地
    for image_str in images_list:
        download_image(image_str)
    # 后台批量下载完成发送通知
    message(webhook_url)

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐