需求:
在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