2020年的一天,某家大型互联网公司的基础设施团队发现了一个令人头疼的问题:他们的容器镜像仓库已经建得非常完善——有权限控制、有审计日志、有跨地域同步,团队为之投入了大量心血。然而当数据科学团队想要发布AI模型、当运维团队想要存储Helm Chart、当安全团队想要存放SBOM软件物料清单时,他们却束手无策。镜像仓库为什么只能存镜像?一个能存“任何云原生制品”的仓库,会是什么样子? 这个问题的答案,就是ORAS(OCI Registry As Storage,OCI注册中心即存储)。你可以把传统的容器镜像仓库想象成一家“披萨专用快递公司”——它的冷链车、保温箱、配送系统都围绕披萨设计得极其精致,效率一流,但它只能送披萨。而ORAS做的事情,是给这家快递公司发了一张“通用运输许可证”——从今往后,AI模型、配置文件、安全审计报告……只要能打包,就能走同一条高效的配送网络。 这套机制有一个官方名字:OCI Artifacts(OCI制品)。它是CNCF(云原生计算基金会)旗下的开源项目,今天已经在GitHub上积累了超过1.5万颗星标,被GitHub Container Registry、Azure Container Registry等主流仓库原生支持。无论你是DevOps工程师、平台工程师还是AI基础设施开发者,理解ORAS都意味着你能够统一制品分发的通道,让“发布一个模型”像“推送一个镜像”一样简单。

岗位关联

ORAS的价值在于工程思维的范式转换:把“为每种文件造专用仓库”转换为“为所有制品统一分发标准”。掌握它,你就能用一套基础设施管理企业所有数字资产,避免数据孤岛,让GitOps真正覆盖AI与配置领域。

目录
  1. 可视化演示
  2. ORAS起源与背景
  3. OCI制品规范
  4. 核心分发原理
  5. ORAS命令操作
  6. 安全分发机制
  7. GitOps落地实践
  8. 生态与未来趋势
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示OCI制品的manifest+layers结构与内容寻址去重、五种制品类型(镜像/Helm/WASM/ML模型/SBOM)存储于OCI仓库,及GitOps流水线中的digest校验机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

ORAS推送与内容寻址存储 CLI推送制品到OCI Registry Manifest引用多个Layer sha256(layer) 内容寻址天然去重防篡改

ORAS起源与背景

想象一下,我们的城市里有一家非常优秀的披萨外卖公司。它的订单系统、配送路线、保温包装都是为了披萨精心定制的,效率惊人。但它有个致命的弱点:你没法让它送一份生日蛋糕、一份加急文件或一束鲜花。这不是它不努力,而是它的整个流程都锁死在“披萨”这个品类上。容器镜像仓库最初的设计正是如此——分层存储、内容寻址、签名验证,一切都围绕容器镜像来定义。然而云原生世界的制品远不止镜像:AI模型权重文件动辄几个GB,Helm Chart是Kubernetes应用的打包格式,SBOM记录着软件的每个依赖组件……这些都需要安全、高效、可版本化的分发通道。

于是OCI(Open Container Initiative,开放容器倡议)在2020年发布了Artifact规范,而ORAS项目成为这一规范的参考实现。ORAS的全称是“OCI Registry As Storage“——注册中心即存储。它本质上是一张”通用运输许可证”:在保留镜像仓库强大能力的前提下,允许你推送和拉取任何类型的制品。

社区对这一能力的回应是爆发式的:GitHub Container Registry(GHCR)率先原生支持了OCI Artifacts;微软的Azure Container Registry紧随其后;而Harbor这个国内最流行的开源仓库则直接提供了“OCI制品”的图形化管理界面。这意味着,DevOps团队不再需要为模型搭建专门的存储服务,不需要为Chart单独维护一个版本库,同一套认证、审计、同步体系可以覆盖所有数字资产。

为什么这不是一个锦上添花的功能,而是一次基础设施的范式升级? 因为当分发通道统一后,CI/CD流水线可以标准化,安全策略可以集中管控,开发者的心智负担显著降低。这就是ORAS诞生的背景——它不是技术的堆砌,而是工程实践中“通用性战胜专用性”的必然选择。

OCI制品规范

要把“通用快递”落到实处,首先要定义“通用包裹”的格式。OCI制品规范的精髓,在于它的Manifest(清单)三层结构。这三层结构可以被理解为快递单据:Manifest 是快递面单,上面写着收件人和包裹内容;Config 是随货附上的说明文件,描述这个包裹的“本质”;Layer 则是快递箱里的实际货物。

内容寻址(Content Addressing)是这套系统的地基。每个Layer都会被计算出一个SHA-256哈希值作为它的唯一标识,像一个人的身份证号。下载时,客户端可以根据哈希值验证数据是否完整无损。这种机制带来的额外收益是去重——如果两个不同的制品包含相同的Layer(比如都依赖同一份基础模型文件),仓库中只需存储一份,从“每个包裹单独装箱”变成了“共享物流箱”。

Config的妙处在于它是可选的、可扩展的。对一个Helm Chart,Config可以描述它的版本号和依赖;对一个AI模型,Config可以记录训练框架和精度指标。这让仓库不再只是“存放字节的地方”,而成为“可查询的制品目录”。当你浏览一个仓库时,可以不下载整个模型,先查看Config就能知道适不适合自己的场景。

Artifact→Config+∑i=1nLayeri\mathrm{Artifact} \rightarrow \mathrm{Config} + \sum_{i=1}^{n}\mathrm{Layer}_i
制品由元数据(Config)和一个或多个数据层(Layer)组成,Manifest 负责描述这个组合关系。
  1. 制品定义Artifact 表示任意类型的云原生制品,比如一个AI模型或一个Chart包。
    Artifact=⟨Manifest,Config,Layers⟩\mathrm{Artifact} = \langle \mathrm{Manifest}, \mathrm{Config}, \mathrm{Layers} \rangle
  2. 配置描述Config 是制品的配置文件,记录制品的类型、作者、版本等元信息,相当于快递单上的备注栏。
    Config=JSON(type,version,metadata)\mathrm{Config} = \mathrm{JSON}(\mathrm{type}, \mathrm{version}, \mathrm{metadata})
  3. 数据分层Layer 是实际数据,按需拆分为多个层,每一层都是独立的blob(二进制大对象),像快递箱可以分箱运输。
    Data=⋃i=1nblobi\mathrm{Data} = \bigcup_{i=1}^{n} \mathrm{blob}_i

核心分发原理

现在我们要深入ORAS最核心的设计理念:注册中心即存储。还是用快递来类比——传统思路是为每种货物建一个专业车队,ORAS则主张“只建一张网络,让所有货物都用它运输”。这意味着ORAS没有发明新的存储系统,而是让现有的镜像仓库(Registry)直接成为通用制品仓库。

这套机制的原理可以分解为四点,每一层都像快递网络中的一道工序。

第一,注册中心即存储(Registry as Storage):ORAS复用了OCI Distribution Spec(OCI分发规范),这意味着一个仓库可以同时存镜像和模型,管理界面、认证体系、网络策略全部复用,就像快递公司用同一套物流网络配送所有商品。

第二,引用关系解析(Referrers API):这是ORAS最独特的创新。在OCI规范中,一个制品可以通过subject字段引用另一个制品,构成“制品 → 被引用制品”的图谱。例如一份SBOM可以通过引用关系“挂在”对应的镜像下面,就像一封体检报告被钉在员工的档案袋上。当你在仓库界面查看镜像时,与之关联的签名、SBOM、扫描报告都会一并展示。这个机制让安全信息和制品本体真正做到了“形影不离”。下面这张图展示了这种引用关系:

第三,认证复用机制(Auth Reuse):ORAS客户端完全复用Docker的认证体系。你使用oras login登录后,凭据会安全地存储在系统的凭证管理器中,和Docker CLI共用同一个~/.docker/config.json。这意味着企业现有的镜像仓库权限策略——包括基于角色的访问控制、服务账号、单点登录——无需任何修改,就能自动覆盖到模型和Chart上。

第四,分层优化策略(Layer Optimization):从镜像分发继承而来的分层机制天然支持断点续传和缓存复用。一个大模型文件被推送到仓库后,第二次推送只会上传变化的层。这使得在企业网络环境下,发布新版AI模型的速度可以提升数量级。

SBOM镜像A→subjectManifest镜像A\mathrm{SBOM}_{\mathrm{镜像A}} \xrightarrow{\text{subject}} \mathrm{Manifest}_{\mathrm{镜像A}}
subject 字段将附加制品(SBOM、签名)与被引用制品(镜像)绑定。
  1. 引用发起方SBOM(软件物料清单)通过 manifest 中的 subject 字段指向目标镜像。
    Referrer:SBOM→Subject:Image\mathrm{Referrer}: \mathrm{SBOM} \rightarrow \mathrm{Subject}: \mathrm{Image}
  2. 关系存储注册中心维护了一张从被引用者到引用者的索引表,支持反向查询。
    Index:Image↦{SBOM,Signature,…}\mathrm{Index}: \mathrm{Image} \mapsto \{\mathrm{SBOM}, \mathrm{Signature}, \ldots\}
  3. 发现查询通过 Referrers API 可以列出某个制品关联的所有引用制品。
    GET  /referrers/Image→[SBOM,Signature]\mathrm{GET}\,\, /referrers/\mathrm{Image} \rightarrow \left[\mathrm{SBOM}, \mathrm{Signature}\right]

ORAS命令操作

现在我们把目光转向实际操作。ORAS的命令行工具与Docker CLI神似——这种相似性正是设计的用心之处:降低学习成本,让用过Docker的开发者零门槛上手。

登录认证是第一步。oras login的使用方式和docker login几乎一致,但你需要注意认证方式的三个关键字:--username和--password提供基础认证,--password-stdin从标准输入读取密码(更安全,因为不会出现在shell历史中)。

push(推送制品的核心命令)的格式可以这样理解:oras push让本地文件进入仓库。它的参数分为三段——目标仓库地址、要推送的文件列表、制品的媒体类型。例如推送一个包含两个文件的AI模型包:

上面的命令把model.bin和lg_weights.bin打包并推送到myregistry.io/models/gpt:v1,并标记这个制品的类型为application/vnd.ai.model。

pull(拉取制品)则是逆向操作:从镜像仓库中拉取制品,输出为一个目录。ORAS会解析Manifest中记录的Layer列表,把所有相关的blob下载并写回本地,就像按清单核对快递箱里的货物。

attach(附加联系)是ORAS非常灵巧的命令——它实现了我们前面讨论的Referrers能力。你可以把一个文件“钉”在某个制品上,而不修改原制品。比如为镜像attached一个签名文件,这个签名由此成为原镜像的“关联引用项”:

discover(发现引用)用来列出某个制品关联的所有附加制品。执行oras discover myregistry.io/app:v9会显示签名、SBOM等所有引用了该镜像的制品——这对安全审计来说是非常实用的“证据档案库”。

bash3 行
oras push myregistry.io/models/gpt:v1 \  --artifact-type application/vnd.ai.model \  model.bin lg_weights.bin
bash3 行
oras attach myregistry.io/app:v9 \  --artifact-type application/vnd.cncf.notary.signature \  signature.json

安全分发机制

任何分发系统,安全都是“压舱石”。ORAS的安全模型不是自己另起炉灶,而是让“验证工具们”都挂靠到仓库这条主干道上——就像快递公司自己不产安检仪,但统一了安检流程。

签名与验签是最关键的环节。在ORAS的世界里,签名不再是一个独立的.sig文件被扔在某个存储桶里,而是作为“引用制品”attach到镜像上。签名工具(如Notation)会生成一个包含签名的Manifest,通过ORAS attach到目标镜像上。任何拉取镜像的客户端,都可以通过oras discover发现签名并验证其有效性:

SBOM审计与签名遵循同样的模式。CI流水线中的扫描工具生成SBOM后,通过ORAS attach到镜像上。审计人员无需在文件系统里翻找分散的审计报告,只需对镜像执行oras discover,就能拿到一份完整的“安全档案”:哪些依赖有漏洞、谁签的名、扫描结果如何,一目了然。

这套机制的深层优势在于统一。无论制品是镜像、Chart还是模型,安全验证的入口、工具链、策略引擎都是同一套。在云原生安全领域,这意味着更少的漏洞、更一致的可观测性。加上策略引擎(如Ratify或OPA)的联动,Kubernetes集群可以在部署前自动检查签名和SBOM,不满足安全门槛的制品直接被拒绝进入集群。

Verify(SignatureImage,PubKeySigner)=true/false\mathrm{Verify}(\mathrm{Signature}_{\mathrm{Image}}, \mathrm{PubKey}_{\mathrm{Signer}}) = \mathrm{true/false}
验签的核心在于:签名与制品紧密关联,且验证所需的公钥可以独立于镜像分发。
  1. 签名生成签名者使用私钥对镜像的digest(摘要值)签名,digest是内容寻址的哈希值。
    Sig=Sign(PrivKey,DigestImage)\mathrm{Sig} = \mathrm{Sign}(\mathrm{PrivKey}, \mathrm{Digest}_{\mathrm{Image}})
  2. 签名分发签名作为独立制品推送到仓库,并通过subject字段关联到镜像。
    Attach(Image←subjectSig)\mathrm{Attach}(\mathrm{Image} \xleftarrow{subject} \mathrm{Sig})
  3. 验签执行拉取方用公钥验签,将本地计算的digest与签名中的比对,一致则验签通过。
    Digestlocal=?Digestsigned\mathrm{Digest}_{\mathrm{local}} \stackrel{?}{=} \mathrm{Digest}_{\mathrm{signed}}

GitOps落地实践

GitOps的核心哲学是“声明式基础设施,一切以Git为唯一事实来源”。在传统做法里,Git仓库存YAML声明,镜像仓库存镜像,而模型和配置文件则散落在各处——这直接破坏了“单一事实来源”的原则。ORAS的出现,让所有制品都能通过OCI仓库统一管理,GitOps的覆盖范围因此大幅扩张。

声明式拉取是第一步。在Kubernetes集群中,Operator可以通过oras pull从镜像仓库拉取模型,然后挂载到Pod中作为推理服务的初始权重。这个过程在代码里表达为一次声明式的“拉取动作”,而不是手动的scp或繁琐的配置下载流程。

版本锁定是生产环境的必备能力。生产环境的部署需要精确到“推送到仓库的哪个版本”,这要求制品必须用不可变的tag或者用digest锁定。ORAS天然支持这种锁定——因为每个manifest都对应一个确定的SHA-256摘要值。在ArgoCD或Flux的自动同步机制中,当新的模型推送后,Git中的引用可以自动更新到新的digest,实现“推送即部署”。

自动同步把这一切串成了流水线。一个完整的机器学习GitOps流程可以是这样的:训练完成后,模型被打包为OCI制品推送到镜像仓库 → CI流水线更新Git仓库中的部署清单(把模型digest加进去)→ ArgoCD检测到Git变更,自动拉取新模型并滚动更新推理服务。这整个过程,开发者的手只需要触碰一次——就是推送模型时那一下。

ORAS让GitOps的“自动同步”资产类型从Pod扩展到了模型、Chart、策略文件。所有交付物遵循同一条分发管道,从此不再是“多轨制”——不再是为镜像用一套、为模型用另一套、为配置再用第三套。

生态与未来趋势

Harbor的完整支持让ORAS在国内企业中落地更加顺畅。Harbor在2.0版本后全面支持OCI制品,你可以为模型和Chart分配独立的项目、设定配额、配置复制规则。对于有合规要求的企业,这意味着所有制品——包括AI模型——都可以纳入统一审计范围。GitHub Container Registry(GHCR)同样在上游提供了原生支持,开发者可以直接推送OCI制品到GHCR,利用GitHub Actions构建完整的CI/CD工作流。

生态工具的持续繁荣正在推动ORAS成为云原生分发的新基线。Notation提供了镜像签名与验证的生态支持;Ratify作为策略引擎,能在Kubernetes中自动执行签名验证和SBOM审计;Harbor的Robot Account可以为自动化流水线提供细粒度的权限控制。标准化演进方面,OCI Artifact规范已进入成熟阶段,其核心设计——用Manifest描述任意内容——被越来越多的工具采用。社区正在讨论如何更好地支持多架构制品、更高效的推送算法,以及与 WASM 等新计算模型的集成。

ORAS选择了一条“兼容并包”的道路:不创造新的存储标准,而是让已有的标准底座长出更多可能。对工程师而言,这意味着一个可以至少用五到十年的基础设施决策。

AI 应用场景

AI模型版本管理与发布

阶段:模型交付与部署(MLOps)

解决的问题:传统方式中,AI模型文件常存放在对象存储或共享文件系统中,缺乏版本控制、权限管理和审计能力。ORAS将模型打包为OCI制品,直接推送到企业已有的镜像仓库,复用其认证、审计和复制能力——这既有“快递单”的标准化,又有“身份核验”的完备性。

具体案例:某电商推荐团队的新模型训练完成后,通过oras push将其推送至Harbor仓库。生产环境的推理集群通过ArgoCD监听Git仓库中模型digest的变更,自动拉取新模型并完成不停机更新。安全团队通过oras discover核对模型的签名和SBOM。

软件供应链安全的统一审计

阶段:安全合规与持续监控

解决的问题:过去镜像的SBOM、签名、扫描报告散落在不同系统中,审计时要跨多个平台收集。ORAS通过subject引用机制,将安全元数据与制品本体的关联固化在分发层,实现了“一个入口看全证据链”。

具体案例:某金融机构的安全团队使用ORAS为每个生产镜像attach SBOM和签名文件。每周的安全扫描中,审计员通过oras discover一键列出所有镜像的安全档案;Kubernetes集群部署时由Ratify策略引擎自动校验签名和SBOM,不合格制品拒绝部署。

Python 演示

python78 行
import subprocessimport hashlib  class ORASClient:    """A practical ORAS client wrapping the CLI with self-describing helpers."""     def __init__(self, registry: str, username: str = "", password: str = ""):        self.registry = registry        self.username = username        self.password = password        self._logged_in = False     def login(self) -> bool:        """Log in to the target registry."""        cmd = [            "oras", "login", self.registry,            "--username", self.username,            "--password-stdin"        ]        proc = subprocess.run(            cmd, input=self.password, capture_output=True, text=True        )        self._logged_in = proc.returncode == 0        return self._logged_in     def push(self, repo_name: str, files: list, version: str,             artifact_type: str) -> str:        """Push a set of local files as one OCI artifact."""        target = f"{self.registry}/{repo_name}:{version}"        args = ["oras", "push", target]        for f in files:            args.append(f)        args.append("--artifact-type")        args.append(artifact_type)        proc = subprocess.run(args, capture_output=True, text=True)        if proc.returncode != 0:            raise RuntimeError(f"push failed: {proc.stderr}")        return target     def pull(self, repo_name: str, version: str, out_dir: str) -> None:        """Pull an artifact into a local directory."""        target = f"{self.registry}/{repo_name}:{version}"        subprocess.run(            ["oras", "pull", target, "-o", out_dir], check=True        )     def attach(self, repo_name: str, version: str, file_path: str,               media_type: str) -> None:        """Attach a file (e.g. SBOM/signature) to an artifact."""        target = f"{self.registry}/{repo_name}:{version}"        cmd = [            "oras", "attach", target,            f"{file_path}:{media_type}"        ]        subprocess.run(cmd, check=True)     def digest(self, repo_name: str, version: str) -> str:        """Fetch the digest of a repository tag (SHA-256)."""        raw = subprocess.run(            ["oras", "manifest", "fetch",             f"{self.registry}/{repo_name}:{version}"],            capture_output=True, text=True, check=True        ).stdout        return hashlib.sha256(raw.encode()).hexdigest()  if __name__ == "__main__":    client = ORASClient("myregistry.io:5000")    ok = client.login()    print("login ok:", ok)    ref = client.push("models/recommender", ["model.bin"], "r42",                      "application/vnd.ai.recommender")    print("pushed:", ref)    client.pull("models/recommender", "r42", "./local_model")    client.attach("models/recommender", "r42", "sbom.json",                  "application/spdx+json")    print("digest:", client.digest("models/recommender", "r42")[:16])
目的:展示了如何用 Python 封装 ORAS CLI,将模型、SBOM 等制品推送/拉取/附加到容器镜像仓库。
  1. target = f"{self.registry}/{repo_name}:{version}"构造“目标”,这是符合 OCI 命名规范的仓库地址+标签,就像快递单上的收件人地址。
  2. ["oras", "push", target]发起 push 推送,target 告诉 ORAS 要把文件送到哪个仓库的哪个标签下。
  3. --artifact-type application/vnd.ai.recommender给制品打上“类型标签”,让仓库和工具能识别这是什么制品。
  4. oras pull target -o out_dir从镜像仓库拉取制品到本地目录,是 push 的逆向操作。
  5. oras attach target f"{file_path}:{media_type}"将文件“附加”到制品上,生成一条关联引用。
  6. proc.returncode != 0检查命令返回值,非0即失败,这是判断 CLI 执行成功与否的关键。
  7. hashlib.sha256(...)从 manifest 计算 SHA-256 摘要值,镜像仓库以这个值作为内容寻址的标识。

常见误区

误区我以为ORAS是一个只能处理容器镜像的小插件,功能类似于`docker tag`的增强版。既然名字里有"Registry",它应该只跟镜像打交道吧。

正解ORAS的核心设计思想恰恰是“不关心内容是什么”。它把Manifest作为描述一切制品的通用结构,镜像只是其中一个特例。你在ORAS中推送AI模型、Helm Chart、签名文件、SBOM,与推送镜像使用完全相同的API和协议。打个比方:Docker是“披萨快递盒”,而ORAS是“通用快递盒”的制造标准——披萨当然能放进去,但放蛋糕和文件同样顺理成章。

为何常见:因为ORAS最早出现在容器镜像仓库的生态圈里,大多数人接触它时都是通过镜像相关场景,自然产生了“它是镜像工具的延伸”的惯性认知。

误区我理解成ORAS是个“替代品”,用了ORAS就不能再用Docker来构建镜像了,它们之间是竞争关系。

正解ORAS与Docker是互补关系而非替代关系。Docker负责镜像的构建、容器的生命周期管理;ORAS负责的是“任意制品到注册中心的分发”。实际项目中,你完全可以用Docker构建镜像、用ORAS推送其他制品,两者使用同一个认证配置、面对同一个仓库。就像一家物流公司既送冷链披萨也送普通包裹,“专用车”和“通用车”共用同一个停车场。

为何常见:看到“ORAS可以推镜像”的示例后,容易理解为“Docker的镜像推送功能被ORAS取代了”,忽略了工具定位的区别。

误区在上K8s之前不需要了解ORAS,因为ORAS是云原生技术栈的一部分,而云原生就等于Kubernetes。

正解ORAS的适用范围远比Kubernetes广阔。任何需要安全分发二进制文件的场景都可以受益:边缘设备上的模型部署、内网的AI模型同步、跨地域的数据库快照分发。它基于OCI Distribution Spec工作,而该规范本身与Kubernetes没有依赖关系。ORAS解决的是“文件如何安全高效地存取”这个通用问题,Kubernetes只是其中一个消费者。

为何常见:ORAS的文档和案例大量出现在K8s相关的文章中,加上它托管于CNCF,容易给人留下“K8s专属配件”的印象。

面试题

Q1. ORAS的全称是什么?

单选题 · easy

  • A.Open Registry And Service
  • B.OCI Registry As Storage← 正确答案
  • C.Original Artifact Stream
  • D.Online Repository Access System

答案:B。ORAS的全称是“OCI Registry As Storage“,即”OCI注册中心即存储”。它表达了一件事:把现有的镜像注册中心当作通用存储来用。A和C是干扰项,D描述的是在线仓库访问系统,都不符合。

Q2. ORAS 的核心创新是什么?

单选题 · easy

  • A.发明了新的数据库引擎
  • B.把镜像仓库变成通用制品存储← 正确答案
  • C.取代了Kubernetes
  • D.创建了新的容器运行时

答案:B。ORAS的初心是“用镜像仓库存一切制品”。它没有发明新存储,而是复用OCI Distribution规范,让模型、Chart、SBOM都能推送到同一个仓库。这与B的描述一致,其他选项与ORAS的定位无关。

Q3. 下列哪些制品可以通过ORAS管理?

多选题 · mid

  • A.AI模型权重文件← 正确答案
  • B.Helm Chart包← 正确答案
  • C.SBOM软件物料清单← 正确答案
  • D.数据库记录

答案:ABC。ORAS可以分发任何按文件组织的制品。AI模型、Helm Chart、SBOM都是典型的OCI制品应用场景。数据库记录是结构化数据,属于数据库系统的管理范畴,不适合作为文件制品分发,因此D不选。

Q4. OCI制品规范中,Manifest的作用是什么?

单选题 · mid

  • A.存储实际业务数据
  • B.描述制品的配置信息
  • C.描述制品的组成结构和引用关系← 正确答案
  • D.提供用户认证

答案:C。Manifest相当于“快递面单”,记录制品的组成——包含哪些层、config是什么、如何引用其他制品。选项B是Config的角色,选项A是Layer的角色,选项D与Manifest无关。

Q5. 在ORAS中,oras attach命令的主要用途是什么?

单选题 · mid

  • A.把本地文件打包上传
  • B.从仓库拉取文件
  • C.把一个制品关联到另一个制品上← 正确答案
  • D.删除仓库中的制品

答案:C。oras attach让一个制品(如SBOM、签名)通过subject字段“挂”在目标制品下方,形成引用关系。这与A(推送)和B(拉取)的“本体分发”不同,C准确地描述了“附加与关联”的概念。

Q6. 使用ORAS需要重新认证吗?

单选题 · easy

  • A.需要,ORAS有自己的独立账户系统
  • B.不需要,ORAS复用Docker/仓库的认证体系← 正确答案
  • C.只在推送时需要认证
  • D.匿名即可访问所有仓库

答案:B。ORAS遵循OCI分发规范,认证机制与Docker完全一致,登录后凭据存储在同一个配置文件中。它没有独立的账户体系(A错),私有仓库的拉取同样需要认证(C错),匿名访问仅限公开仓库(D错)。

Q7. 关于ORAS的内容寻址机制,下列说法正确的是?

多选题 · hard

  • A.每个Layer基于内容生成SHA-256摘要← 正确答案
  • B.相同内容在仓库中只存储一份← 正确答案
  • C.不同制品可以共享相同的Layer← 正确答案
  • D.内容必须完全加载到内存才能计算摘要

答案:ABC。内容寻址意味着Layer的标识由内容哈希决定,因此相同内容只需存储一次(A、B对)。共享Layer是分层复用的核心收益,不同制品可共享同一份基础文件(C对)。流式计算摘要即可,无需完全加载到内存(D错)。

Q8. 在GitOps中使用ORAS的好处是什么?

单选题 · hard

  • A.让Git仓库存储所有二进制文件
  • B.让制品分发链路统一,Git只存引用← 正确答案
  • C.替代ArgoCD
  • D.让Kubernetes不再需要镜像仓库

答案:B。GitOps主张Git为唯一事实来源,但二进制大文件不适合进Git库。ORAS让制品可通过不可变digest引用,Git仓库只记录制品引用信息,实现统一的制品分发与版本锁定。A、D都与GitOps理念相悖,C混淆了工具职责。

Q9. 以下哪些行为属于ORAS的典型安全应用?

多选题 · hard

  • A.用oras attach附加SBOM到镜像← 正确答案
  • B.用oras attach附加签名文件← 正确答案
  • C.通过referrers API自动发现制品的安全元数据← 正确答案
  • D.用oras push覆盖已有镜像的tag

答案:ABC。ORAS的安全最佳实践是将SBOM、签名等安全元数据attach到制品上,并通过referrers API发现它们,形成完整的证据链。D是操作习惯问题,与安全应用无关,且在生产环境中随意覆盖tag还会破坏不可变性。

Q10. 推动ORAS生态繁荣的最大外部因素是什么?

单选题 · easy

  • A.各家仓库供应商对OCI Artifacts的原生支持← 正确答案
  • B.ORAS采用了专有的文件格式
  • C.只有Harbor支持OCI制品
  • D.Docker官方宣布弃用容器

答案:A。GHCR、Azure Container Registry、Harbor等主流仓库对OCI Artifacts的原生支持是生态繁荣的基石。B错误,ORAS恰恰是开源的OCl标准;C错误,支持者远不止Harbor;D错误,与Docker弃用无关。