批量下载harbor中的镜像(脚本)
·
- 用于批量下载某个仓库中的所有镜像
- 用于批量下载所有仓库中的所有镜像
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)
更多推荐
所有评论(0)