JAVA实现镜像tar包上传到harbor镜像仓库

Docker镜像离线迁移:深入解析docker save/load与tar/tar.gz格式选择 Docker镜像作为容器化技术的核心,其分层存储机制(Union File System)是实现高效构建与部署的基础。理解镜像由多层只读文件系统叠加而成的原理,是掌握容器技术的关键。这种设计不仅提升了存储和传输效率,更为持续集成和离线部署提供了便利。在无法访问镜像仓库的离线环境或安全隔离网络中,docker save与docker load命令成为镜像迁移的必备工具。它们通过将完整镜像及其元数据打包为归档文件,实现了环境间的可靠传递。归档时面临tar与tar.gz格式的选择:tar格式保留了原始结构便于直接 阅读详情

前言

  使用harbor过程中,一直想使用harbor的api实现镜像的上传功能,但是实际上harbor是直接调用了docker registry的api,harbor层只是做了一个透传的功能,这个可以参考《harbor权威指南》这本书,参考官网接口以及网上大佬的思想,实现了一个Java版本,主要是实现了docker daemon上传的逻辑。

docker镜像tar包结构

实现上传首先需要将镜像的tar包解压,读取目录结构,一个典型的docker镜像包(使用docker save命令)结构如下:

.
├── 1ecf8bc84a7c3d60c0a6bbdd294f12a6b0e17a8269616fc9bdbedd926f74f50c
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── 6f4ec1f3d7ea33646d491a705f94442f5a706e9ac9acbca22fa9b117094eb720.json
├── aaac5bde2c2bcb6cc28b1e6d3f29fe13efce6d6b669300cc2c6bfab96b942af4
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── b63363f0d2ac8b3dca6f903bb5a7301bf497b1e5be8dc4f57a14e4dc649ef9bb
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── c453224a84b8318b0a09a83052314dd876899d3a1a1cf2379e74bba410415059
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── dd8ef1d42fbcccc87927eee94e57519c401b84437b98fcf35505fb6b7267a375
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── manifest.json
└── repositories

清单文件manifet.json结构

[
    {
        "Config":"6f4ec1f3d7ea33646d491a705f94442f5a706e9ac9acbca22fa9b117094eb720.json",
        "RepoTags":[
            "alpine:filebeat-6.8.7-arm64"
        ],
        "Layers":[
            "aaac5bde2c2bcb6cc28b1e6d3f29fe13efce6d6b669300cc2c6bfab96b942af4/layer.tar",
            "dd8ef1d42fbcccc87927eee94e57519c401b84437b98fcf35505fb6b7267a375/layer.tar",
            "c453224a84b8318b0a09a83052314dd876899d3a1a1cf2379e74bba410415059/layer.tar",
            "b63363f0d2ac8b3dca6f903bb5a7301bf497b1e5be8dc4f57a14e4dc649ef9bb/layer.tar",
            "1ecf8bc84a7c3d60c0a6bbdd294f12a6b0e17a8269616fc9bdbedd926f74f50c/layer.tar"
        ]
    }
]

manifest.json 包含了对这个tar包的描述信息,比如image config文件地址,tags说明,镜像layer信息,在解析的时候也是根据这个文件去获取关联的文件

上传流程

  1. 获取鉴权信息
  2. 检查layer.tar是否已经存在
  3. 上传layer.tar
  4. 上传image config
  5. 上传manifest(非包中的manifest.json而是Manifest struct)
  1. 核心实现类DockerImageUploadBiz.java
    /**
     * @author Administrator
     */
    @Service
    @Slf4j
    public class DockerImageUploadBiz {
        
        //远程仓库
        @Value("${docker.remote.repo}")
        private String targetRepoAddress;
        
        //本地解压路径
        @Value("${docker.upload.extractPath}")
        private String tarPath;
        
        //harbor用户名
        @Value("${docker.harbor.userName}")
        private String userName;
        
        //密码
        @Value("${docker.harbor.password}")
        private String password;
        
        /**
        * @param sourceTar 上传的镜像文件
        * @param project 项目
        */
        public void push(File sourceTar, String project) {
            if (!sourceTar.exists()) {
                log.warn("Error!file is not exist!path:{}", sourceTar);
                return;
            }
            try {
                String unTarPath = FileUtil.doUnArchiver(sourceTar, tarPath);
                String manifest = FileUtil.readJsonFile(unTarPath + File.separator + "manifest.json");
                JSONArray jsonArray = JSONObject.parseArray(manifest);
                if (Objects.isNull(jsonArray)) {
                    log.warn("manifest convert error!path:{},content:{}", unTarPath + File.separator + "manifest.json", manifest);
                    return;
                }
                for (Object arr : jsonArray) {
                    JSONObject jsonObject = (JSONObject) arr;
                    JSONArray repoTags = jsonObject.getJSONArray("RepoTags");
                    for (Object repoTag : repoTags) {
                        String repo = repoTag.toString();
                        String substring = repo.substring(repo.lastIndexOf('/') + 1);
                        String[] split = substring.split(":");
                        String imageName = split[0];
                        String tag = split[1];
                        log.info("imageName:{},tag:{}", imageName, tag);
                        JSONArray layers = jsonObject.getJSONArray("Layers");
                        //1.上传layer
                        log.info("========================STEP:1/3===============================");
                        log.info("PUSHING LAYERS STARTING...");
                        List<String> layerPathList = new ArrayList<>(layers.size());
                        int i = 1;
                        for (Object layer : layers) {
                            String layerPath = unTarPath + File.separator + layer.toString();
                            log.info("PUSHING LAYER:{}-{} ...", i, layers.size());
                            layerPathList.add(layerPath);
                            pushLayer(project, layerPath, imageName);
                            i++;
                        }
                        log.info("PUSHING LAYERS ENDED...");
    
                        log.info("========================STEP:2/3===============================");
                        //2.上传config
                        log.info("PUSHING CONFIG STARTING...");
                   
第二十一章: Kubernetes - DevOps 之 Harbor 和 Jenkins 搭建 本文介绍了基于Kubernetes的DevOps架构方案,重点讲解了Harbor镜像仓库的部署过程。方案采用分层架构设计,包含Kubernetes集群服务器、Jenkins构建服务器和Harbor镜像仓库服务器。详细说明了Harbor服务器的证书生成与配置流程,包括CA证书私钥生成、x509 v3扩展文件创建、证书转换及Docker证书配置等关键步骤,确保Harbor的安全访问。文章提供了完整的命令行操作指南,为搭建企业级Kubernetes DevOps环境提供了实用参考。 阅读详情

相关推荐

云原生容器技术实战:从Docker到Harbor全栈指南

容器技术作为云原生架构的核心组件,通过操作系统级虚拟化实现应用隔离与快速部署。其底层依赖Linux内核的cgroups和namespace机制,配合镜像分层存储实现轻量化封装。在微服务场景下,容器网络模型需要处理跨主机通信,常见的CNI插件如Calico通过BGP协议实现路由分发,而存储卷管理则涉及持久化数据落盘策略。企业级实践中,Harbor私有仓库提供镜像安全扫描与访问控制,配合Docker Compose可实现多环境配置管理。根据CNCF调研,92%企业已采用容器化方案,其中网络性能优化与资源限制策略

SAN_YUN的专栏 476

Docker镜像分层原理与生产环境构建优化实践

容器化部署已成为现代软件交付的基石,而镜像作为容器运行的核心载体,其设计与优化直接关系到交付效率。理解镜像由只读层叠加、容器层写入的存储模型,是掌握Docker镜像分层机制的关键。基于OverlayFS的写时复制让多个容器共享底层数据,同时保持隔离,这也是镜像缓存与增量拉取能够成立的原理基础。在实际工程中,利用好Dockerfile的层缓存规则、采用多阶段构建精简体积,并结合Harbor等私有仓库实现不可变Tag与高效分发,能显著提升CI/CD流水线的构建速度与生产环境的稳定性。无论你是开发者还是运维,掌握

cuankuangzhong6373的博客 432

小白跑WRF第三天,安装三方依赖库

小白跑WRF第三天,安装三方依赖库各类安装包的准备 各类安装包的准备 官网教程:https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compilation_tutorial.php 根据官网教程需要的安装包有以下几个 系统环境 用途 zlib-1.2.7 zlib是提供数据压缩用的函式库。 netcdf-4.1.3 读nc文件的。 mpich-3.0.4 用于并行运算的工具。 libpng-1.2.50 libpng是一款C语言编写的比较底层

weixin_42372313的博客 1万+

Mamba vs YOLO:目标检测选型指南(附实际项目对比)

本文深入对比了Mamba和YOLO在目标检测领域的性能差异与应用场景。通过实际项目数据,分析了两者在城市交通监控、工业质检等场景下的表现,提供了详细的选型指南和部署优化建议,帮助开发者根据实时性、精度等需求选择最适合的解决方案。

weixin_29062255的博客 368

保姆级教程:在Ubuntu 20.04上搞定pybind11,解决‘找不到头文件’的坑

本文提供了一份详细的Ubuntu 20.04下pybind11配置指南,重点解决常见的'找不到头文件'问题。从环境准备、安装策略到三种专业解决方案(修改CMakeLists.txt、环境变量方案、绝对路径包含),帮助开发者高效搭建C++与Python的桥梁。

weixin_28829325的博客 284

【PLC】三菱PLC控件安装疑难解析:Error Number:-119的全面解决方案

本文针对三菱PLC控件安装过程中常见的Error Number:-119错误,提供了深度解析与实战解决方案。该错误通常源于Windows系统权限限制或文件冲突。文章从理解错误本质入手,逐步介绍了以管理员身份运行、手动注册DLL文件、采用新版环境搭配旧版控件的黄金组合以及系统环境修复等四大招法,帮助用户彻底解决这一安装难题,确保工控软件稳定运行。

jj890的博客 496

Windows下用MSYS2一键搞定Verilator安装(附国内镜像加速)

本文详细介绍了在Windows系统下,如何利用MSYS2工具和国内镜像源,快速、高效地完成Verilator的安装与配置。通过替换清华镜像源加速下载,并配合Pacman包管理器,实现近乎一键式的安装流程,有效解决了传统方法步骤繁琐、网络依赖下载慢的问题,为数字电路仿真提供了便捷的Windows环境解决方案。

weixin_29208327的博客 592

用angr找到strcpy的栈溢出漏洞

这篇文章其实是分析angr文档里给出的一个挖漏洞的小例子。 原文链接在此:https://docs.angr.io/examples#beginner-vulnerability-discovery-example-strcpy_find 这是第一个用angr在二进制里找可利用条件的教程。第一个例子是一个非常简单的程序。这个angr脚本会从程序的entry到strcpy找到一条路径。(只有我们能够控制strcpy的参数的时候) 为了找到正确的路径,angr需要去算一个密码参数,算这个密码,angr只要2s

^_^ 1220

【100分】【等和子数组最小和】

逆序排序,这样能够使得在分组时优先选取较大的元素,以便将元素分配到较小的子集中,从而使得每个子集的和相对均衡。给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。分成若干个组,使得每组的和相等,并求出满足条件的所有分组中,组内元素和的最小值。在递归的过程中,我们需要注意一个优化点,即避免将相同和的桶重复计算。4 个子集(5),(1,4),(2,3),(2,3)2 个子集(5, 1, 4),(2,3, 2,3)个子集,则返回子集和的最小值,如果不能,则将。

weixin_54707168的博客 1168

9篇1章1节:中国居民健康与营养调查(CHNS)数据库的官网解析和数据下载(2026年版)

在探讨中国社会经济转型与人口健康变迁的学术领域中,中国健康与营养调查(CHNS) 是一个无法绕过的权威数据库。本文将带你深入了解CHNS的项目背景、庞大的数据体系,以及如何通过这两个核心网站获取关键的家庭、个人及社区层面的研究数据。

MD Code 1696

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: centos7 部署harbor镜像仓库
下一篇: docker pull 镜像 报server misbehaving 异常信息
白日做梦_
博客等级 码龄10年 235粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值