Harbor-v2.11.2通过API仓库镜像批量导入和导出

需求: 在harbor仓库中有好多镜像,需要迁移至其他环境, 需要批量导出和下载 . 如果单个上传,下载,因为工作量比较大 ,容易出错. 解决: Harbor 提供有丰富的 API 接口,可以获取所有项目信息、镜像和标签等信息。通过编写 shell 脚本循环处理即可实现批量导出镜像包的需求。 点进去

需求:

在harbor仓库中有好多镜像,需要迁移至其他环境, 需要批量导出和下载 . 如果单个上传,下载,因为工作量比较大 ,容易出错.

解决:

Harbor 提供有丰富的 API 接口,可以获取所有项目信息、镜像和标签等信息。通过编写 shell 脚本循环处理即可实现批量导出镜像包的需求。

点进去web管理界面点进去 Harbor API V2.0

获取 Harbor 中所有项目名称:

找到 GET 方法的 /projects 条目,点击 Try it out,可以填写项目名称和页面和页面条目数,直接点击蓝色按钮 Execute 即可

从 json 格式响应体中可以看到项目信息,记录其中需要导出镜像的

[
  {
    "artifact_count": 1,
    "creation_time": "2024-12-02T08:45:42.431Z",
    "id": 75,
    "name": "openstack.kolla/skyline-apiserver",
    "project_id": 3,
    "pull_count": 4,
    "update_time": "2024-12-02T12:29:09.214Z"
  },
  {
    "artifact_count": 1,
    "creation_time": "2024-12-02T08:40:14.215Z",
    "id": 74,
    "name": "openstack.kolla/skyline-console",
    "project_id": 3,
    "pull_count": 4,
    "update_time": "2024-12-02T12:29:09.387Z"
  },
  {
    "artifact_count": 1,
    "creation_time": "2024-11-29T10:54:55.703Z",
    "id": 73,
    "name": "openstack.kolla/nova-novncproxy",
    "project_id": 3,
    "pull_count": 9,
    "update_time": "2024-12-02T12:29:09.388Z"
  },
  {
    "artifact_count": 1,
    "creation_time": "2024-11-29T10:00:13.995Z",
    "id": 72,
    "name": "openstack.kolla/cinder-backup",
    "project_id": 3,
    "pull_count": 10,
    "update_time": "2024-12-02T12:32:49.413Z"
  }
]

可以直接curl请求临时验证取值是否正确

curl -s -k -u '用户:密码' "https://harbor域名或ip/api/v2.0/projects/项目名称/repositories?page=1&page_size=100" | jq -r  '.[].name'

以我的项目为例子,以下都是镜像名称:

root@harbor:~# curl -s -k -u 'admin:XAXXX' "https://192.168.100.164/api/v2.0/projects/openstack.kolla/repositories?page=1&page_size=100" | jq -r  '.[].name'
openstack.kolla/skyline-apiserver
openstack.kolla/skyline-console
openstack.kolla/nova-novncproxy
openstack.kolla/cinder-backup
openstack.kolla/mariadb-clustercheck
openstack.kolla/haproxy
openstack.kolla/keepalived
openstack.kolla/tgtd
openstack.kolla/memcached
openstack.kolla/iscsid
openstack.kolla/rabbitmq
openstack.kolla/cron
openstack.kolla/nova-libvirt
openstack.kolla/fluentd
openstack.kolla/openvswitch-db-server
openstack.kolla/openvswitch-vswitchd
openstack.kolla/mariadb-server
openstack.kolla/kolla-toolbox
openstack.kolla/horizon
openstack.kolla/neutron-dhcp-agent
openstack.kolla/neutron-metadata-agent
openstack.kolla/neutron-openvswitch-agent
openstack.kolla/placement-api
openstack.kolla/neutron-l3-agent
openstack.kolla/glance-api
openstack.kolla/heat-api
openstack.kolla/heat-engine
openstack.kolla/heat-api-cfn
openstack.kolla/neutron-server
openstack.kolla/keystone-fernet
openstack.kolla/keystone-ssh
openstack.kolla/cinder-api
openstack.kolla/keystone
openstack.kolla/cinder-scheduler
openstack.kolla/cinder-volume
openstack.kolla/nova-scheduler
openstack.kolla/nova-conductor
openstack.kolla/nova-api
openstack.kolla/nova-ssh
openstack.kolla/nova-spicehtml5proxy
openstack.kolla/nova-compute

批量导出容器镜像shell脚本

#!/bin/bash
# 基于harbor-v2.11.2
# 设置Harbor仓库的地址、项目名、用户名和密码
HARBOR_URL="仓库的地址"  # Harbor 仓库的 URL
HARBOR_NAME="harbor名称"  # Harbor 的名称,用于构建镜像标签
PROJECT="项目名称"  # Harbor 中的项目名称
USERNAME="用户"  # Harbor 的用户名
PASSWORD="密码"  # Harbor 的密码

# 获取项目中所有镜像的列表
images=$(curl -s -k -u ${USERNAME}:${PASSWORD} "${HARBOR_URL}/api/v2.0/projects/${PROJECT}/repositories?page=1&page_size=100" | jq -r '.[].name')

mkdir /tmp/docker
# 循环拉取每个镜像
for image in ${images}; do
  # 除去 PROJECT 内容
  image_sub=${image//${PROJECT}\//}
  echo "$image_sub"  # 输出处理后的镜像名称

  # 将 '/' 替换为 '%252F' 以适应 URL 编码
  image_reg=${image_sub//\//%252F}

  # 获取镜像的所有 artifacts(包括标签信息)
  artifacts=$(curl -s -k -u "${USERNAME}:${PASSWORD}" -X 'GET' "${HARBOR_URL}/api/v2.0/projects/${PROJECT}/repositories/${image_reg}/artifacts?with_tag=true" | jq -r '.[].digest')
  
  # 循环处理每个 artifact
  for artifact in ${artifacts}; do
    # 获取 artifact 的所有标签
    tags=$(curl -s -k -u "${USERNAME}:${PASSWORD}" -X 'GET' "${HARBOR_URL}/api/v2.0/projects/${PROJECT}/repositories/${image_reg}/artifacts/${artifact}/tags?page=1&page_size=10&with_signature=false&with_immutable_status=false" | jq -r '.[].name')
    
    # 循环处理每个标签
    for tag in ${tags}; do
      # 输出 docker pull 命令
      echo "docker pull ${HARBOR_NAME}/${image}:${tag}"
      # 执行 docker pull 命令
      docker pull "${HARBOR_NAME}/${image}:${tag}"
      
      # 将镜像标签记录到文件中
      echo "${HARBOR_NAME}/${image}:${tag}" >> /tmp/docker/images-list.txt
      
      # 输出 docker save 命令
      echo "docker save ${HARBOR_NAME}/${image}:${tag} > /tmp/docker/${HARBOR_NAME}-${image//\//-}-${tag}.tar.gz"
      # 执行 docker save 命令,将镜像保存为 tar.gz 文件
      docker save "${HARBOR_NAME}/${image}:${tag}" > "/tmp/docker/${HARBOR_NAME}-${image//\//-}-${tag}.tar.gz"
      
      # 输出 docker rmi 命令
      echo "docker rmi -f ${HARBOR_NAME}/${image}:${tag}"
      # 执行 docker rmi 命令,删除本地镜像
      docker rmi -f "${HARBOR_NAME}/${image}:${tag}"
    done
  done
done

批量导入容器镜像shell脚本

for i in `ll /tmp/docker|awk '{print $9}'`;do docker load < $i;done

批量删除当前主机含有私有仓库容器镜像

#!/bin/bash
HARBOR_NAME="harbor名称"
docker images | awk '{print $1":"$2}'| grep ${HARBOR_NAME} | xargs docker rmi

Comment