将镜像tar包通过API直接push到registry仓库

docker镜像导出保存为tar和tar包导入成docker镜像 docker镜像导出保存为tar; tar包导入成docker镜像 阅读详情

为了实现docker tar包能够直接通过页面上传,调研了一下registry的api,以及如何解析tar包(其实就是docker daemon程序实现的部分)。

要想实现,首先要了解docker tar包中结构组成:

tar包结构

拿了一个包含一个镜像的tar包进行解压:

.
├── 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

文件说明:

「manifest.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信息,在解析的时候也是根据这个文件去获取关联的文件。

「image config文件」

比如:6f4ec1f3d7ea33646d491a705f94442f5a706e9ac9acbca22fa9b117094eb720.json文件:

❝

内容太多就不贴了 这里包含了镜像运行的信息,比如env,执行参数,以及镜像历史等。

❞

「layer层文件:layer.tar」

镜像的每一层的文件信息都打包在了一个单独的layer.tar包中,也是在上传的时候需要用到的。

registry api

「流程:」

  • 1、获取鉴权信息

  • 2、检查layer.tar是否已经存在

  • 3、上传layer.tar

  • 4、上传image config

  • 5、上传manifest(非包中的manifest.json而是Manifest struct)

❝

这里只列出了在上传的时候需要用的api

❞

1、获取鉴权信息

这里跟registry仓库选择的鉴权方式有关,可选basic auth或者token鉴权。这里我是以最基本的basic auth为例子,如果是token鉴权的方式参考这里:https://docs.docker.com/registry/spec/auth/jwt/

2、检查上传

HEAD /v2/image/blobs/<digest>

若返回200 OK 则表示存在,不用上传

3、开始上传服务 我这里是以分块上传的方式进行

POST /v2/image/blobs/uploads/

如果post请求返回202 accepted,一个url会在location字段返回.

202 Accepted
     Location: /v2/\<image>/blobs/uploads/\<uuid>
     Range: bytes=0-<offset>
     Content-Length: 0
     Docker-Upload-UUID: <uuid> # 可以用来查看上传状态和实现断点续传

4、分块上传 根据上一步获取的url,以PATCH的方式提交分块数据。如果是最后一块数据上传,则以PUT的方式提交,如下:

> PUT /v2/<name>/blob/uploads/<uuid>?digest=<digest>
 > Content-Length: <size of chunk>
 > Content-Range: <start of range>-<end of range>
 > Content-Type: application/octet-stream
   <Last Layer Chunk Binary Data>

上传layer,image config,manifests信息都是一样的。

❝

我暂时只用到了以上api,更多的api参考:https://docs.docker.com/registry/spec/api/

❞

实现

上面说API没啥感觉,还是看代码比较明白,所以实现了这么一个工具:https://github.com/silenceper/docker-tar-push

「Usage:」

push your docker tar archive image without docker.

Usage:
  docker-tar-push [flags]

Flags:
  -h, --help              help for docker-tar-push
      --log-level int     log-level, 0:Fatal,1:Error,2:Warn,3:Info,4:Debug (default 3)
      --password string   registry auth password
      --registry string   registry url
      --skip-ssl-verify   skip ssl verify
      --username string   registry auth username

「Example:」

docker-tar-push alpine:latest --registry=http://localhost:5000

「参考」

  • https://www.jianshu.com/p/6a7b80122602

  • https://github.com/Razikus/dockerregistrypusher

  • https://docs.docker.com/registry/spec/auth/jwt/

  • https://github.com/docker/distribution/

JAVA实现镜像tar包上传到harbor镜像仓库 阅读详情

相关推荐

容器镜像仓库原理:内容寻址、push/pull 深度拆解与生产避坑

容器镜像仓库是云原生基础设施的核心组件,其本质并非文件存储服务,而是基于内容寻址(Content Addressing)构建的分布式协作系统。它通过 SHA256 哈希唯一标识 manifest、config 和 layer 等 blob 对象,实现强一致性、跨镜像层共享与防篡改验证。技术价值体现在提升存储效率(平均层复用率达 3.7 镜像/层)、保障供应链安全(拉取时逐层校验 digest)及支撑高并发 CI/CD 流水线。典型应用场景包括私有 Harbor 集群运维、边缘离线节点调试、nerdctl 与

java2000.net 421

docker镜像仓库搭建、导入导出 、迁移

当更换服务器的时候需要进行docker镜像的迁移

sinat_36912869的博客 370

GitLab内置容器镜像仓库实战:私有Registry一键启用与CI/CD集成

Docker镜像仓库是云原生应用交付的核心基础设施,其本质是遵循OCI规范的分层存储服务,通过HTTP API实现镜像推送、拉取与清单管理。相比独立部署的Docker Registry或Harbor,GitLab内置Container Registry依托代码仓库元数据,天然实现权限统一、生命周期同步与CI/CD深度集成,显著降低运维复杂度与安全审计成本。该方案特别适用于已采用GitLab进行代码托管的企业级场景,支持自动化镜像构建、语义化标签管理、基于角色的细粒度访问控制(如QA仅pull),并可在Ubu

weixin_34067102的博客 353

5.新特性-foreach循环

上代码: import com.alibaba.fastjson.JSON; import com.yutu.fileupload.mapper.UserMapper; import com.yutu.fileupload.pojo.User; import com.yutu.fileupload.service.UserService; import org.apache.tools.tar.TarEntry; import org.apache.tools.tar.TarInputStream; i.

weixin_39563769的博客 582

GitLab内置容器镜像仓库实战:零运维构建可追溯私有Registry

容器镜像仓库是现代CI/CD中实现镜像存储、分发与治理的核心基础设施。其本质是基于OCI规范的HTTP服务,通过Docker Registry v2协议提供镜像上传、拉取、清单管理与元数据存储能力。技术价值在于统一权限控制、审计溯源、自动化生命周期管理及安全合规支撑。典型应用场景包括企业私有化部署、GitOps流水线集成、Kubernetes镜像供给及漏洞扫描闭环。本文聚焦GitLab原生Container Registry能力,结合CI/CD深度集成,实现镜像构建与代码提交强绑定、标签语义化管控、自动清理

weixin_34205826的博客 573

docker本地镜像推送到私有库-Docker Registry

私有仓库介绍 阿里云ECS Docker 生态如下图: 上次我们提到使用阿里云的仓库,但像 Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。 这时候就会用到Docker Registry, 官方提供的工具,可以用于构建私有镜像仓库 私有仓库实现步骤 1) 下载镜像 [root@k8s-master ~]# docker pull registry Using default tag: lat

互联网老辛 2654

go-containerregistry 将crane 保存的tar导入docker daemon 中

go-containerregistry 将crane 保存的tar导入docker daemon 中

guoguangwu的专栏 631

离线环境用registry.tar.gz部署Docker私有镜像仓库

在容器化交付实践中,镜像分发的可靠性直接决定内网部署进度。当目标环境无法访问公网Docker Hub时,利用docker save导出的离线镜像包成为常见的资源传递方式。registry.tar.gz就是这样一个包含Docker Registry官方镜像的压缩归档,通过docker load即可导入内网机器,再以单容器方式启动一个私有镜像仓库。该方案具备部署轻量、资源占用低等优势,适合几十人规模团队的离线镜像分发。同时对比了它与Harbor的适用边界,并给出TLS认证、htpasswd账号配置、数据卷挂载等

weixin_29973493的博客 259

基于docker push原理进行tar镜像上传至harbor仓库(未分片)

本文将基于开源Harbor镜像仓库,详细解析如何通过Java代码实现完整的Docker镜像推送流程。通过分析核心代码,揭示镜像推送背后的技术细节。

qq_43804919的博客 398

离线环境包 registry.tar.gz 的识别、挂载与推送全流程

在无法连接外网的服务器环境中,软件交付常以 Docker 镜像压缩包形式出现,其中 registry.tar.gz 是最常见的一种离线镜像载体。它可能是 registry 数据卷备份,也可能是 docker save 后的镜像捆包,二者在解压、挂载与推送流程上完全不同。理解 Docker Registry 的 v2 存储结构、镜像 load 与 push 的基本原理,能帮助工程师在不依赖公网的情况下,快速搭建内网私有镜像仓库。这类技术广泛应用于信创环境、KubeKey 部署 KubeSphere、工业现场交

weixin_31766003的博客 178

docker仓库镜像registry.tar.gz

docker仓库镜像,用于docker仓库安装配置 docker仓库安装配置操作方法已发布,可点击主页进行查看

私有Docker镜像仓库搭建指南:从Docker Registry到企业级部署

容器化技术作为现代应用部署的核心基础设施,其镜像管理是保障CI/CD流程稳定运行的关键环节。私有镜像仓库通过在内网环境存储Docker镜像,解决了公共仓库的网络延迟、安全合规和版本控制等问题。在技术实现上,基于Docker Registry的轻量级方案适合小型团队快速搭建,而Harbor则提供了企业级的功能扩展。通过配置认证机制、存储管理和网络访问控制,私有仓库能够显著提升镜像推送和拉取效率,降低对外部依赖。在容器化部署和持续集成场景中,稳定的私有镜像仓库成为团队内部可靠的镜像分发中心,支持自动化构建、安全

ciya3282的博客 395

registry.tar

docker registry image,docker 私有仓库搭建所需镜像。docker load -i registry ,解压镜像包。

Docker Registry 内核解析:push/pull 背后的协议、分层与内容寻址

容器镜像仓库(Registry)并非简单的文件存储服务,而是一种基于内容寻址(content-addressable)的分布式制品协作系统。其核心原理在于通过 manifest 声明镜像结构、以 layer blob 实现增量存储与网络复用,并依赖分块上传(chunked upload)保障弱网环境下的传输可靠性。这种设计赋予 Registry 高效分发、强一致性校验和跨平台可复用等技术价值,广泛应用于 CI/CD 流水线、多集群镜像同步及金融级安全交付等生产场景。深入理解 registry HTTP AP

weixin_30652897的博客 479

docker私有仓库镜像registry.tar

docker容器化部署时创建私有仓库时需要用到的registry镜像

3GPP协议解读_NTN系列(一)_38.811_非地面网络(NTN)的背景、应用场景和信道建模

非地面网络覆盖广,对物理攻击和自然灾害有一定的抵抗性。本文根据3GPP协议对NTN网络的背景、应用场景和信道模型进行了整理。

JCMLSY的博客 4925

buildah source push 命令详解:将源码镜像从本地路径推送至容器镜像仓库

`buildah source push` 是 Buildah 中实验性的 source 子命令族(create / add / pull / push)的收尾环节:它负责把通过 `buildah source create` 创建、`buildah source add` 追加源码工件后保存在本地 OCI 目录布局中的“源码镜像”(source image),推送到远程容器镜像仓库,供他人拉取复

gitblog_00790的博客 404

PADS VX2.4差分对设置避坑指南:常见错误与解决方案

本文深度解析了在PADS VX2.4中进行高速PCB设计时,差分对设置的核心要点与常见陷阱。针对Layout规则设置、Router布线实战中的阻抗控制、线长匹配等关键环节,提供了具体的避坑指南和解决方案,帮助工程师确保信号完整性,提升设计质量。

weixin_29216049的博客 359

从源码构建 Docker Registry(distribution):Moby 仓库内 BUILDING 指南的完整实战解读

> **导读**:本篇文章围绕 Moby 仓库中随源码一起 vendored 的 Docker Distribution 项目构建文档([vendor/github.com/docker/distribution/BUILDING.md](https://link.gitcode.com/i/236ef328bfb28e35dd69d036fa65e4aa)),系统讲解如何从源码编译出 Regis

gitblog_00626的博客 905

【云迁移工具RDA】迁移常见问题

Agent无法正常启动,Linux系统提示“SMS.0201 Failed to start sms agent!”,Windows系统提示“SMS.0201 源端主机网络繁忙,无法连接api网关”。该问题通常是由于源端没有通公网,或者没有按照要求配置hosts,无法与iam或者sms通信导致。需要排查源端网络。1.登录源端服务器。2.检查源端是否能正常访问互联网,若无法访问,请处理后重新启动Agent。可参考弹性公网IP Ping不通检查源端的DNS,防火墙,安全组、本地网络等。

2404_89358774的博客 1486

Linux之GTK系列教程

00、背上行囊1——程序员学习之道 01、背上行囊2——为什么要学习GTK 02、背上行囊3——GUI概述 03、背上行囊4——GTK简介 04、背上行囊5——GTK环境搭建( Linux ) 05、背上行囊6——GTK环境搭建( windows ) 06、踏上旅途1——一个简单的空白窗口 07、踏上旅途2——控件的添加 08、踏上旅途3——布局容器之水平布局 09、踏上旅途

每天积累一点点 2万+

Harbor 仓库安装 - 基认证的容器镜像仓库

本文档详细介绍了基于 HTTPS 证书认证的 Harbor 私有镜像仓库搭建流程。首先阐述了 Harbor 作为企业级容器镜像管理平台的核心功能,包括多租户隔离、RBAC 权限控制、镜像扫描与签名、高可用架构等。

a_2373179473的博客 1342

企业级大数据平台的数据网格(Data Mesh)转型之路

随着企业数字化转型的深入,传统大数据平台面临数据孤岛化、治理成本高、业务响应慢等核心痛点。数据网格作为一种新兴的分布式数据管理架构,通过领域驱动设计(DDD)、数据产品化和联邦治理模式,为企业提供了打破数据壁垒、提升数据生产力的全新路径。本文聚焦企业级数据平台从传统架构(数据湖/数据仓库)向数据网格转型的关键技术、实施步骤和组织配套,涵盖技术架构设计、核心算法实现、项目实战案例及工具链推荐。背景介绍:定义转型目标、术语体系与核心挑战核心概念与联系:解析数据网格四大支柱及技术架构图谱核心算法原理。

AI 领航者的博客 1084
上一篇: 在x86_64机器上构建arm64镜像
下一篇: 使用keda完成基于事件的弹性伸缩
学点程序
博客等级 码龄12年 64粉丝 68原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值