<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>OCI Registry As Storage Blog</title>
        <link>https://oras.land/blog</link>
        <description>OCI Registry As Storage Blog</description>
        <lastBuildDate>Tue, 09 Sep 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[🚀 Announcing ORAS v1.3.0 - Elevate your artifact and registry management workflows]]></title>
            <link>https://oras.land/blog/oras-v1.3.0</link>
            <guid>https://oras.land/blog/oras-v1.3.0</guid>
            <pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The ORAS community is thrilled to announce the ORAS CLI v1.3.0, a release packed with stability upgrades and pioneering capabilities. Beyond strengthening existing core functionality, this version introduces three major new features designed to elevate your artifact and registry management workflows:]]></description>
            <content:encoded><![CDATA[<p>The ORAS community is thrilled to announce the ORAS CLI v1.3.0, a release packed with stability upgrades and pioneering capabilities. Beyond strengthening existing core functionality, this version introduces three major new features designed to elevate your artifact and registry management workflows:</p>
<ol>
<li class=""><strong>Portable backup &amp; restore of repositories and artifacts</strong></li>
<li class=""><strong>Multi-platform image and artifact management</strong></li>
<li class=""><strong>Rich formatted output for scripting and pipelines</strong></li>
</ol>
<p>Moreover, ORAS is now fully compliant with OCI <a href="https://github.com/opencontainers/distribution-spec/releases/tag/v1.1.1" target="_blank" rel="noopener noreferrer" class="">distribution-spec v1.1.1</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-registrys-safety-net-portable-backup--restore">Your Registry’s Safety Net: Portable Backup &amp; Restore<a href="https://oras.land/blog/oras-v1.3.0#your-registrys-safety-net-portable-backup--restore" class="hash-link" aria-label="Direct link to Your Registry’s Safety Net: Portable Backup &amp; Restore" title="Direct link to Your Registry’s Safety Net: Portable Backup &amp; Restore" translate="no">​</a></h2>
<p>With <code>oras backup</code> and <code>oras restore</code>, ORAS now lets you save your registry content into local directories or tarballs (OCI image layout format) as a snapshot and <strong>restore to any registry</strong>. All manifests and optionally any tags, referrers will be included within the backup.</p>
<p>Use cases include:</p>
<ul>
<li class=""><strong>Air-Gapped Environments</strong>: Organizations operating in isolated or high-security environments can use <code>oras backup</code> to export artifacts from a registry to local filesystem, and use <code>oras restore</code> to import them into an internal registry with restricted access.</li>
<li class=""><strong>Disaster Recovery and Audit Archival</strong>: Take periodic snapshots of repositories and store them off-site. In case of accidental deletions, outages, and long-term storage to support regulatory audits, <code>oras restore</code> can be used to quickly recover full registry content.</li>
<li class=""><strong>Registry Migration</strong>: When moving from one container registry provider to another, the pair of commands enables a full repository export, preserving tags, manifests, layers, and referrers.</li>
<li class=""><strong>Compliance and supply chain security guarantee</strong>: Backup and restore the images along with their supply chain artifacts, such as SBOMs, signatures, vulnerability scanning reports.</li>
<li class=""><strong>Repository Duplication or Promotion</strong>: Move artifacts from dev to staging to prod registries reliably using an intermediate backup file.</li>
</ul>
<p>Check out the user guide <a href="https://oras.land/docs/how_to_guides/backup-restore">Backup and Restore of OCI Artifacts, Images, and Repositories</a> for details.</p>
<p><img decoding="async" loading="lazy" alt="Portable Backup &amp;amp; Restore" src="https://oras.land/assets/images/oras-backup-restore-3f3e25fc58dd369340b7188808836231.svg" width="960" height="1033" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-platform-image-and-artifact-management">Multi-platform Image and Artifact Management<a href="https://oras.land/blog/oras-v1.3.0#multi-platform-image-and-artifact-management" class="hash-link" aria-label="Direct link to Multi-platform Image and Artifact Management" title="Direct link to Multi-platform Image and Artifact Management" translate="no">​</a></h2>
<p>Multi-platform images are commonly used in IoT and Edge computing, particularly heterogeneous deployments. In addition, OpenTofu or Terraform modules are packed as platform-specific artifacts and stored as multi-platform artifact in OCI registries. Thanks to our community partner OpenTofu, now multi-platform artifact management is introduced in v1.3.0.</p>
<p>With <code>oras manifest index create</code> and <code>oras manifest index update</code>, you can easily assemble, update, distribute, and annotate multi-architecture images and artifacts across local environments and registries. Check out the user guide <a href="https://oras.land/docs/how_to_guides/multiarch">Create and Manage Multi-architecture Artifacts</a> for details.</p>
<p><img decoding="async" loading="lazy" alt="Multi-platform Image and Artifact Management" src="https://oras.land/assets/images/create-multi-arch-5b92d37b9ea08d9985d3122f4453db63.svg" width="3006" height="2027" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enable-scripting-and-automation-formatted-output">Enable Scripting and Automation: Formatted Output<a href="https://oras.land/blog/oras-v1.3.0#enable-scripting-and-automation-formatted-output" class="hash-link" aria-label="Direct link to Enable Scripting and Automation: Formatted Output" title="Direct link to Enable Scripting and Automation: Formatted Output" translate="no">​</a></h2>
<p>In automation pipelines, the difference between human-readable and machine-usable output can be the difference between clarity and chaos.</p>
<p>With this release, ORAS enables users to use the <code>--format</code> flag to format metadata output into structured data (e.g. JSON) and optionally use the <code>--template</code> flag with the <a href="https://pkg.go.dev/text/template" target="_blank" rel="noopener noreferrer" class="">Go template language</a>. This has been enabled for commands like <code>pull</code>, <code>push</code>, <code>attach</code>, <code>discover</code>, and <code>manifest fetch</code> with support for output formats including JSON, Go templates, trees, and tables. You can even run computations with Sprig template functions as well.</p>
<ul>
<li class="">Use <code>--format &lt;DATA_FORMAT&gt;</code> to transform the output of ORAS commands into different formats including prettified JSON, tree, table view, and Go template, i.e. <code>--format json|tree|table|go-template=GO_TEMPLATE</code>.</li>
<li class="">Use <code>--template GO_TEMPLATE</code> to compute and manipulate the output using Go templates based on the chosen data format.</li>
</ul>
<p>Formatted output transforms ORAS from a simple terminal user tool to a <strong>DevOps-friendly, integrable</strong> developer tool. Check out the user guide <a href="https://oras.land/docs/how_to_guides/format_output">Formatted output</a> for details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stability--user-experience-polish">Stability &amp; User Experience Polish<a href="https://oras.land/blog/oras-v1.3.0#stability--user-experience-polish" class="hash-link" aria-label="Direct link to Stability &amp; User Experience Polish" title="Direct link to Stability &amp; User Experience Polish" translate="no">​</a></h2>
<p>This release also includes a number of enhancements that provides a better overall user experience and stability.</p>
<ul>
<li class=""><strong>Feature Stability Promotions</strong>: <code>oras attach</code>, <code>oras pull --include-subject</code>, and more are now <code>Stable</code>. <code>oras resolve</code> from <code>Experimental</code> to <code>Preview</code>.</li>
<li class=""><strong>Discover UX</strong>: <code>oras discover</code> now displays referrers recursively by default; The maximum recursion depth can be controlled via the --depth flag</li>
<li class=""><strong>Loong64 support</strong>: More platform options including <a href="https://wiki.debian.org/Ports/loong64" target="_blank" rel="noopener noreferrer" class="">loong64</a> open for users.</li>
<li class=""><strong>Developer experience</strong>: Enhanced clarity within error messages, debugging logs, and a number of documentation updates.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-release-matters">Why This Release Matters<a href="https://oras.land/blog/oras-v1.3.0#why-this-release-matters" class="hash-link" aria-label="Direct link to Why This Release Matters" title="Direct link to Why This Release Matters" translate="no">​</a></h2>
<p>Whether you're looking to backup and restore entire registries, publish multi-architecture bundles, or integrate ORAS into CI/CD pipelines, v1.3.0 brings the tools and the end-to-end artifact management solutions you need.</p>
<ul>
<li class=""><strong>Platform teams</strong> gain robust disaster recovery and migration tooling.</li>
<li class=""><strong>DevOps engineers</strong> get the multi-arch flexibility needed for heterogeneous infrastructure.</li>
<li class=""><strong>CI/CD and platform builders</strong> enjoy structured data outputs for reliable, scriptable workflows.</li>
<li class=""><strong>Maintainers</strong> ship safer, cleaner, and more future-proof artifact workflows.</li>
</ul>
<p>There are a few bug fixes and a deprecated feature in this release. For a concrete changelog, please see the <a href="https://github.com/oras-project/oras/releases/tag/v1.3.0" target="_blank" rel="noopener noreferrer" class="">ORAS v1.3.0 Release Notes</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thanks-to-all-contributors">Thanks to All Contributors<a href="https://oras.land/blog/oras-v1.3.0#thanks-to-all-contributors" class="hash-link" aria-label="Direct link to Thanks to All Contributors" title="Direct link to Thanks to All Contributors" translate="no">​</a></h2>
<p>Thanks to our existing maintainers <a href="https://github.com/Wwwsylvia" target="_blank" rel="noopener noreferrer" class="">@Wwwsylvia</a>, <a href="https://github.com/TerryHowe" target="_blank" rel="noopener noreferrer" class="">@TerryHowe</a>, <a href="https://github.com/FeynmanZhou" target="_blank" rel="noopener noreferrer" class="">@FeynmanZhou</a>, <a href="https://github.com/shizhMSFT" target="_blank" rel="noopener noreferrer" class="">@shizhMSFT</a>, <a href="https://github.com/sabre1041" target="_blank" rel="noopener noreferrer" class="">@sabre1041</a>, <a href="https://github.com/sajayantony" target="_blank" rel="noopener noreferrer" class="">@sajayantony</a>, <a href="https://github.com/qweeah" target="_blank" rel="noopener noreferrer" class="">@qweeah</a> who contributed to ORAS v1.3.0 and new contributors 🎉 <a href="https://github.com/bcho" target="_blank" rel="noopener noreferrer" class="">@bcho</a>, <a href="https://github.com/njucjc" target="_blank" rel="noopener noreferrer" class="">@njucjc</a>, <a href="https://github.com/nmiyake" target="_blank" rel="noopener noreferrer" class="">@nmiyake</a>, <a href="https://github.com/mauriciovasquezbernal" target="_blank" rel="noopener noreferrer" class="">@mauriciovasquezbernal</a>, <a href="https://github.com/Horiodino" target="_blank" rel="noopener noreferrer" class="">@Horiodino</a>, <a href="https://github.com/chrisguitarguy" target="_blank" rel="noopener noreferrer" class="">@chrisguitarguy</a>, <a href="https://github.com/kysucix" target="_blank" rel="noopener noreferrer" class="">@kysucix</a>, <a href="https://github.com/RohanMishra315" target="_blank" rel="noopener noreferrer" class="">@RohanMishra315</a>, <a href="https://github.com/apparentlymart" target="_blank" rel="noopener noreferrer" class="">@apparentlymart</a>, <a href="https://github.com/tanyabhatnagar" target="_blank" rel="noopener noreferrer" class="">@tanyabhatnagar</a>, <a href="https://github.com/amazingfate" target="_blank" rel="noopener noreferrer" class="">@amazingfate</a> 🚀.</p>
<p>You can follow the <a href="https://oras.land/docs/1.3.0/installation" target="_blank" rel="noopener noreferrer" class="">installation guidance</a> to install ORAS v1.3.0 and try it out for yourself.
End user feedback is essential in any open source project. If you run into issues or have any suggestions, please open an issue. To engage with the community, feel free to <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">join the Slack channel in CNCF</a> and find us in the <strong>oras</strong> channel.</p>]]></content:encoded>
            <category>oci</category>
            <category>artifact</category>
        </item>
        <item>
            <title><![CDATA[🚀 Announcing ORAS v1.3.0-beta.3 - Enrich formatted output of oras discover]]></title>
            <link>https://oras.land/blog/oras-v1.3.0-beta.3</link>
            <guid>https://oras.land/blog/oras-v1.3.0-beta.3</guid>
            <pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The ORAS Community is thrilled to announce the release of ORAS v1.3.0-beta.3! This milestone continues our vision to make managing OCI artifacts easier, faster, and more intuitive for users and developers.]]></description>
            <content:encoded><![CDATA[<p>The ORAS Community is thrilled to announce the release of <code>ORAS v1.3.0-beta.3</code>! This milestone continues our vision to make managing OCI artifacts easier, faster, and more intuitive for users and developers.</p>
<p>This release includes new features, critical improvements, and bug fixes as we fine-tune ORAS for the upcoming stable release. Let’s dive into what’s new!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-whats-new">✨ What's New?<a href="https://oras.land/blog/oras-v1.3.0-beta.3#-whats-new" class="hash-link" aria-label="Direct link to ✨ What's New?" title="Direct link to ✨ What's New?" translate="no">​</a></h2>
<p><a href="https://oras.land/docs/concepts/reftypes" target="_blank" rel="noopener noreferrer" class="">OCI referrers</a> is to associate additional artifacts with a container image without modifying the original image itself. Referrers are useful for software supply chain security, metadata enrichment, and artifact management.</p>
<p><code>oras discover</code> provides structured output to show OCI referrers of a manifest in a registry or an OCI image layout. Previously, <code>oras discover</code> only shows direct referrers with limited metadata. Since this release, the output of <code>oras discover</code> has been enriched with showing all referrers recursively in all formatted outputs (tree, JSON, go-template) with annotations displayed by default. The subject manifest details is added to <code>oras discover</code> JSON output. It provides an informative output and ensures data consistency of different data formats in the output.</p>
<p>The tree view has better readability with colored-code visual effect on console as the screenshot shows below.</p>
<p><img decoding="async" loading="lazy" alt="oras tree view" src="https://oras.land/assets/images/oras-discover-tree-944eeffb0b63f891e13981dab66720a0.jpg" width="3020" height="1394" class="img_ev3q"></p>
<p>In addition, <code>oras</code> introduces an experimental <code>--depth</code> flag for <code>oras discover</code>, allowing users to specify the maximum depth of referrers in the formatted output. It avoids throttling or performance issues when a subject image has a complex referrer graph. For example, users can list the direct referrers of a subject image by specifying <code>--depth 1</code> as the screenshot below.</p>
<p><img decoding="async" loading="lazy" alt="oras tree view" src="https://oras.land/assets/images/oras-discover-tree-depth-338c4f0ba7d9dbfe61bc1120dc90f881.jpg" width="2826" height="898" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes-and-deprecation-you-should-know">Breaking Changes and Deprecation You Should Know<a href="https://oras.land/blog/oras-v1.3.0-beta.3#breaking-changes-and-deprecation-you-should-know" class="hash-link" aria-label="Direct link to Breaking Changes and Deprecation You Should Know" title="Direct link to Breaking Changes and Deprecation You Should Know" translate="no">​</a></h2>
<ul>
<li class="">The global flag <code>--no-tty</code> flag has been removed, now available only for <code>oras</code> commands that need TTY behavior, improves consistency across commands.</li>
<li class="">The property <code>manifests</code> has been renamed to <code>referrers</code> in the JSON output of <code>oras discover</code></li>
<li class="">The <code>table</code> output format is deprecated for <code>oras discover</code></li>
</ul>
<p>A sample output of <code>oras discover</code> in JSON format:</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras discover ghcr.io/kyverno/test-verify-image:signed --format json</span><br></div></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/kyverno/test-verify-image@sha256:b31bfb4d0213f254d361e0079deaaebefa4f82ba7aa76ef82e90b4935ad5b105"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.docker.distribution.manifest.v2+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:b31bfb4d0213f254d361e0079deaaebefa4f82ba7aa76ef82e90b4935ad5b105"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">938</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"referrers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/kyverno/test-verify-image@sha256:7f870420d92765b42cec0f71ee8e25bf39b692f64d95d6f6607e9e6e54300265"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:7f870420d92765b42cec0f71ee8e25bf39b692f64d95d6f6607e9e6e54300265"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">738</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"annotations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"io.cncf.notary.x509chain.thumbprint#S256"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[\"da1f2d7d648dfacc7ebd59f98a9f35c753c331d80ca4280bb94060f4af4a5357\"]"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"org.opencontainers.image.created"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-05-22T21:45:06Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"artifactType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.cncf.notary.signature"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/kyverno/test-verify-image@sha256:f89cb7a0748c63a674d157ca84d725ff3ac09cc2d4aee9d0ec4315e0fe92a5fd"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:f89cb7a0748c63a674d157ca84d725ff3ac09cc2d4aee9d0ec4315e0fe92a5fd"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">699</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"annotations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"org.opencontainers.image.created"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-05-25T16:13:11Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"artifactType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"vulnerability-scan"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"referrers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/kyverno/test-verify-image@sha256:ec45844601244aa08ac750f44def3fd48ddacb736d26b83dde9f5d8ac646c2f3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:ec45844601244aa08ac750f44def3fd48ddacb736d26b83dde9f5d8ac646c2f3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">728</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"annotations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"io.cncf.notary.x509chain.thumbprint#S256"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[\"da1f2d7d648dfacc7ebd59f98a9f35c753c331d80ca4280bb94060f4af4a5357\"]"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"org.opencontainers.image.created"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-05-25T16:19:29Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"artifactType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.cncf.notary.signature"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/kyverno/test-verify-image@sha256:8cad9bd6de426683424a204697dd48b55abcd6bb6b4930ad9d8ade99ae165414"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:8cad9bd6de426683424a204697dd48b55abcd6bb6b4930ad9d8ade99ae165414"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">695</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"annotations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"org.opencontainers.image.created"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-05-25T16:17:41Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"artifactType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sbom/cyclone-dx"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"referrers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/kyverno/test-verify-image@sha256:61f3e42f017b72f4277c78a7a42ff2ad8f872811324cd984830dfaeb4030c322"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:61f3e42f017b72f4277c78a7a42ff2ad8f872811324cd984830dfaeb4030c322"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">728</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"annotations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"io.cncf.notary.x509chain.thumbprint#S256"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[\"da1f2d7d648dfacc7ebd59f98a9f35c753c331d80ca4280bb94060f4af4a5357\"]"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"org.opencontainers.image.created"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-05-25T16:20:01Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"artifactType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.cncf.notary.signature"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/kyverno/test-verify-image@sha256:aa886b475b431a37baa0e803765a9212f0accece0b82a131ebafd43ea78fa1f8"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:aa886b475b431a37baa0e803765a9212f0accece0b82a131ebafd43ea78fa1f8"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">681</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"annotations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"org.opencontainers.artifact.description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CycloneDX JSON SBOM"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"artifactType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.cyclonedx+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"referrers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/kyverno/test-verify-image@sha256:00c5f96577878d79b545d424884886c37e270fac5996f17330d77a01a96801eb"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:00c5f96577878d79b545d424884886c37e270fac5996f17330d77a01a96801eb"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">728</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"annotations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"io.cncf.notary.x509chain.thumbprint#S256"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[\"da1f2d7d648dfacc7ebd59f98a9f35c753c331d80ca4280bb94060f4af4a5357\"]"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"org.opencontainers.image.created"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-07-10T16:55:36Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"artifactType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.cncf.notary.signature"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ghcr.io/kyverno/test-verify-image@sha256:f3dc4687f5654ea8c2bc8da4e831d22a067298e8651fb59d55565dee58e94e2d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:f3dc4687f5654ea8c2bc8da4e831d22a067298e8651fb59d55565dee58e94e2d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">728</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"annotations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"io.cncf.notary.x509chain.thumbprint#S256"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[\"da1f2d7d648dfacc7ebd59f98a9f35c753c331d80ca4280bb94060f4af4a5357\"]"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"org.opencontainers.image.created"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-07-10T16:56:36Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"artifactType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.cncf.notary.signature"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ...</span><br></div></code></pre></div></div>
<p>There are a few bug fixes and a deprecated feature in this release. For a concrete changelog, please see <a href="https://github.com/oras-project/oras/releases/tag/https://github.com/oras-project/oras/releases/tag/v1.3.0-beta.3" target="_blank" rel="noopener noreferrer" class="">ORAS CLI v1.3.0-beta.3 Release Notes</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-the-oras-community">Join the ORAS community<a href="https://oras.land/blog/oras-v1.3.0-beta.3#join-the-oras-community" class="hash-link" aria-label="Direct link to Join the ORAS community" title="Direct link to Join the ORAS community" translate="no">​</a></h2>
<p>You can follow this <a href="https://oras.land/docs/1.3.0-beta/installation" target="_blank" rel="noopener noreferrer" class="">installation guidance</a> to install ORAS v1.3.0-beta.3 and have a try.
Feedback is crucial at this stage. If you run into issues or have suggestions, please open an issue. <a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Join the Slack channel in CNCF</a> and find us at <strong>oras</strong> channel.</p>]]></content:encoded>
            <category>oras</category>
            <category>artifact</category>
        </item>
        <item>
            <title><![CDATA[Announcing ORAS v1.2.0 - OCI Spec v1.1.0 support, formatted output, and more!]]></title>
            <link>https://oras.land/blog/oras-new-release</link>
            <guid>https://oras.land/blog/oras-new-release</guid>
            <pubDate>Wed, 29 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[The ORAS project maintainers are proud to announce ORAS CLI v1.2.0 and ORAS-go v2.5.0. These two releases are ready for production use. ORAS CLI v1.2.0 introduces OCI Spec v1.1.0 support, formatted output, brand-new terminal experience with progress bar, and more!]]></description>
            <content:encoded><![CDATA[<p>The <a href="https://oras.land/" target="_blank" rel="noopener noreferrer" class="">ORAS</a> project maintainers are proud to announce ORAS CLI v1.2.0 and ORAS-go v2.5.0. These two releases are ready for production use. ORAS CLI v1.2.0 introduces OCI Spec v1.1.0 support, formatted output, brand-new terminal experience with progress bar, and more!
This article walks you through the notable features and how these enhancements benefit ORAS users as well as the cloud-native ecosystem.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-oras-v120">What's new in ORAS v1.2.0<a href="https://oras.land/blog/oras-new-release#whats-new-in-oras-v120" class="hash-link" aria-label="Direct link to What's new in ORAS v1.2.0" title="Direct link to What's new in ORAS v1.2.0" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="oci-spec-v110-support">OCI Spec v1.1.0 support<a href="https://oras.land/blog/oras-new-release#oci-spec-v110-support" class="hash-link" aria-label="Direct link to OCI Spec v1.1.0 support" title="Direct link to OCI Spec v1.1.0 support" translate="no">​</a></h3>
<p>ORAS CLI v1.2.0 and ORAS-go v2.5.0 are now compliant with OCI <a href="https://github.com/opencontainers/image-spec/blob/v1.1.0" target="_blank" rel="noopener noreferrer" class="">image-spec v1.1.0</a> and <a href="https://github.com/opencontainers/distribution-spec/tree/v1.1.0" target="_blank" rel="noopener noreferrer" class="">distribution-spec v1.1.0</a>.
With OCI Spec v1.1.0 implemented by more and more OCI registries and officially supported in the ORAS client side, these major capabilities are officially enabled for users:</p>
<ul>
<li class="">Able to create, store, and distribute non-container artifacts, such as Helm Chart, Kubernetes manifest file, See <a href="https://oras.land/docs/concepts/artifact" target="_blank" rel="noopener noreferrer" class="">OCI Artifact concept</a> for details.</li>
<li class="">Able to establish relationships between different artifacts. This allows users to associate the supply chain artifacts like SBOM, signature, vulnerability scanning report with the image. See <a href="https://oras.land/docs/concepts/reftypes#the-art-of-associating-artifacts" target="_blank" rel="noopener noreferrer" class="">The Art of Associating Artifacts</a> for details.</li>
<li class="">Able to discover and query artifact relationships, able to distribute a graph of artifacts across registries. See <a href="https://oras.land/docs/concepts/reftypes#listing-referrers" target="_blank" rel="noopener noreferrer" class="">Listing Referrers concept</a> for details.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="formatted-output">Formatted output<a href="https://oras.land/blog/oras-new-release#formatted-output" class="hash-link" aria-label="Direct link to Formatted output" title="Direct link to Formatted output" translate="no">​</a></h3>
<p>ORAS CLI has very basic output to show command operation result to human. For machine processing, especially in automation scenarios like scripting and CI/CD pipelines, developers may want to perform batch operations and chain different commands with ORAS, as well as filtering, modifying, and sorting objects based on the ORAS outputs.
Developers expect that ORAS output can be emitted as machine-readable text, so that it can be used to perform further data manipulation.</p>
<p>With formatted output support in ORAS v1.2.0, it enables users to use the <code>--format</code> to format metadata output into structured data (e.g. JSON) and optionally use the <code>--template</code> with the <a href="https://pkg.go.dev/text/template" target="_blank" rel="noopener noreferrer" class="">Go template</a> to manipulate the output data.</p>
<p>For example, push a file and two tags to a repository and show the descriptor of the image manifest in pretty JSON format:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras push $REGISTRY/$REPO:$TAG1,$TAG2 sbom.spdx vul-scan.json --format json </span><br></div></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"$REGISTRY/$REPO@sha256:4a5b8c83d153f52afdfcb422db56c2349aae3bd5ecf8338a58353b5eb6681c45"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:4a5b8c83d153f52afdfcb422db56c2349aae3bd5ecf8338a58353b5eb6681c45"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">820</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"annotations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"org.opencontainers.image.created"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2023-12-15T09:41:54Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"artifactType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"json/example"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"referenceByTags"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"$REGISTRY/$REPO:$TAG1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"$REGISTRY/$REPO:$TAG2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>If you want to filter out the value of reference and media type of the pushed artifact in the standard output, use Go template functions as follows:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras push $REGISTRY/$REPO:$TAG1,$TAG2 sbom.spdx vul-scan.json --format go-template='{{.reference}}, {{.mediaType}}'</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$REGISTRY/$REPO@sha256:4a5b8c83d153f52afdfcb422db56c2349aae3bd5ecf8338a58353b5eb6681c45, application/vnd.oci.image.manifest.v1+json</span><br></div></code></pre></div></div>
<p>This feature is still in "Experimental" stage. We welcome feedback and contributions to make this feature more mature.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="progress-output-to-show-real-time-status">Progress output to show real-time status<a href="https://oras.land/blog/oras-new-release#progress-output-to-show-real-time-status" class="hash-link" aria-label="Direct link to Progress output to show real-time status" title="Direct link to Progress output to show real-time status" translate="no">​</a></h3>
<p>Keeping track of manifest content download and upload has never been more intuitive and informative. With the progress output, users can witness the real-time status of manifest content pulling, pushing, and transferring. This is really helpful and effective when pulling or pushing large-size content from or to the registry.</p>
<p><a href="https://asciinema.org/a/661599" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://asciinema.org/a/661599.svg" alt="asciicast" class="img_ev3q"></a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-enhancements">Other enhancements<a href="https://oras.land/blog/oras-new-release#other-enhancements" class="hash-link" aria-label="Direct link to Other enhancements" title="Direct link to Other enhancements" translate="no">​</a></h3>
<ul>
<li class="">Support X.509 mTLS authentication with OCI registries by introducing <code>--cert-file</code> and <code>--key-file</code> in several ORAS commands</li>
<li class="">Support deletion of manifests and blobs in OCI image layout</li>
<li class="">Introduce <code>--platform</code> to oras attach for better multi-arch attaching experience, which allows adding referrer artifact to a specific sub-platform</li>
<li class="">Introduce <code>oras resolve</code> to get the digest of an artifact</li>
</ul>
<p>In addition, the overall user experience and performance are also enhanced in this release:</p>
<ul>
<li class="">Reduce authentication request count for several ORAS commands and support blob mounting across repositories in the same registry for <code>oras copy</code></li>
<li class="">Improve error message based on <a href="https://github.com/oras-project/oras/blob/v1.2.0/docs/proposals/error-handling-guideline.md" target="_blank" rel="noopener noreferrer" class="">ORAS CLI error handling guidance</a></li>
</ul>
<p>There are a few bug fixes and a deprecated feature in this release. For a concrete changelog, please see <a href="https://github.com/oras-project/oras/releases/tag/v1.2.0" target="_blank" rel="noopener noreferrer" class="">ORAS CLI v1.2.0 Release Notes</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-oras-cli-in-terminal-docker-container-and-cicd-pipelines">Use ORAS CLI in terminal, Docker container and CI/CD pipelines<a href="https://oras.land/blog/oras-new-release#use-oras-cli-in-terminal-docker-container-and-cicd-pipelines" class="hash-link" aria-label="Direct link to Use ORAS CLI in terminal, Docker container and CI/CD pipelines" title="Direct link to Use ORAS CLI in terminal, Docker container and CI/CD pipelines" translate="no">​</a></h3>
<p>ORAS installation binary is available on Winget, Homebrew, Snap, GitHub and Docker container image. It can be installed via one simple command. Please see the installation guide for your environment.</p>
<p>The <a href="https://github.com/marketplace/actions/setup-oras" target="_blank" rel="noopener noreferrer" class="">ORAS GitHub Actions</a> has been upgraded to ORAS CLI v1.2.0. ORAS CLI has also been integrated with the hosted runner machines (<a href="https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2204-Readme.md#cli-tools" target="_blank" rel="noopener noreferrer" class="">Ubuntu 22.04</a> and <a href="https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md#cli-tools" target="_blank" rel="noopener noreferrer" class="">Ubuntu 20.04</a>) on GitHub Actions and Azure DevOps as a preinstalled software. This delivers out-of-box experience to use ORAS in CI/CD pipelines.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next-for-oras">What's next for ORAS<a href="https://oras.land/blog/oras-new-release#whats-next-for-oras" class="hash-link" aria-label="Direct link to What's next for ORAS" title="Direct link to What's next for ORAS" translate="no">​</a></h2>
<p>ORAS CLI v1.3.0 will focus on verbose logs improvement for a better troubleshooting experience, image index for multi-arch image management, and annotating experience improvement. See the <a href="https://github.com/oras-project/oras/discussions/1311" target="_blank" rel="noopener noreferrer" class="">ORAS v1.3.0 milestone</a> for details. Any feedback are welcome!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-the-oras-community">Join the ORAS community<a href="https://oras.land/blog/oras-new-release#join-the-oras-community" class="hash-link" aria-label="Direct link to Join the ORAS community" title="Direct link to Join the ORAS community" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://x.com/intent/follow?screen_name=orasproject" target="_blank" rel="noopener noreferrer" class="">Follow ORAS on X</a></li>
<li class=""><a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Join the Slack channel in CNCF</a> and find us at <strong>oras</strong> channel</li>
</ul>]]></content:encoded>
            <category>oras</category>
            <category>artifact</category>
        </item>
        <item>
            <title><![CDATA[Lightweight Registry with Oras OCI-Layouts and Object Storage in The Cloud]]></title>
            <link>https://oras.land/blog/lightweight-cloud-registry-oras</link>
            <guid>https://oras.land/blog/lightweight-cloud-registry-oras</guid>
            <pubDate>Sat, 14 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[ORAS Lightweight Cloud Registry]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="oras-lightweight-cloud-registry">ORAS Lightweight Cloud Registry<a href="https://oras.land/blog/lightweight-cloud-registry-oras#oras-lightweight-cloud-registry" class="hash-link" aria-label="Direct link to ORAS Lightweight Cloud Registry" title="Direct link to ORAS Lightweight Cloud Registry" translate="no">​</a></h2>
<p>Setting up a centralized cloud OCI registry is sometimes too much for small scale tests and proof of concepts!<br>
<!-- -->What if I told you there was a lightweight alternative?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="everything-should-be-a-file">Everything Should Be a File<a href="https://oras.land/blog/lightweight-cloud-registry-oras#everything-should-be-a-file" class="hash-link" aria-label="Direct link to Everything Should Be a File" title="Direct link to Everything Should Be a File" translate="no">​</a></h2>
<p>One of the great Unix philosophies is the concept of making everything a file.
Modems, keyboards, printers, disk drives, serial interfaces, configuration, kernel parameters, IPC, everything and anything is a file that you can <code>read()</code> and/or <code>write()</code>.</p>
<p>In a nutshell, this separates a many concerns to the file system layer instead of your program.<br>
<!-- -->It allows, among other things, plugging stuff into any program without writing special integration code.
That code was already written in the "driver" for that "device", so why repeat yourself in the program?</p>
<p>In General: <strong>programs write and read files</strong><br>
<!-- -->Making everything a file means that you can generally interface with every program.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="oras-is-eiaf-compatible">Oras is <a href="https://en.wikipedia.org/wiki/Everything_is_a_file" target="_blank" rel="noopener noreferrer" class="">EIAF</a> Compatible<a href="https://oras.land/blog/lightweight-cloud-registry-oras#oras-is-eiaf-compatible" class="hash-link" aria-label="Direct link to oras-is-eiaf-compatible" title="Direct link to oras-is-eiaf-compatible" translate="no">​</a></h3>
<p><code>oras</code> has a <code>--oci-layout</code></p>
<p>Instead of talking to an upstream service over <code>http/https</code>, <code>oras</code> can create the OCI artifact structure as files and directories.</p>
<p>Most (if not every) operation that can be performed on an upstream registry can also be performed locally as an OCI directory structure.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-object-storage-is-eiaf-compatible">Cloud Object Storage is <a href="https://en.wikipedia.org/wiki/Everything_is_a_file" target="_blank" rel="noopener noreferrer" class="">EIAF</a> Compatible<a href="https://oras.land/blog/lightweight-cloud-registry-oras#cloud-object-storage-is-eiaf-compatible" class="hash-link" aria-label="Direct link to cloud-object-storage-is-eiaf-compatible" title="Direct link to cloud-object-storage-is-eiaf-compatible" translate="no">​</a></h3>
<p>The file system is the foundation on which EIAF rests upon.<br>
<!-- -->They are special components that convert media (CD, Tape, HDD, Controllers, etc.) into interface layers of which you can read/write files.</p>
<p>If you can mount <strong>it</strong> as a file system, you got EIAF.</p>
<p>Your preferred Cloud provider should have its own FUSE driver for their object storage offering, and if it doesn't, there is probably an alternative.</p>
<ul>
<li class=""><a href="https://github.com/GoogleCloudPlatform/gcsfuse" target="_blank" rel="noopener noreferrer" class="">Google Cloud Storage</a></li>
<li class=""><a href="https://github.com/Azure/azure-storage-fuse" target="_blank" rel="noopener noreferrer" class="">Azure Blob Storage</a></li>
<li class=""><a href="https://github.com/s3fs-fuse/s3fs-fuse" target="_blank" rel="noopener noreferrer" class="">AWS Simple Storage Service</a> (Unofficial)</li>
</ul>
<hr>
<p>It is useful to think of Object Storage as <code>key: data</code> databases instead of the file systems they pretend to be.</p>
<p>Mounting one as a file system <strong>should</strong> be seen as "unintended functionality" and it breaks some assumptions programs make about file systems.</p>
<blockquote>
<p>Example: Instant nanosecond retrieval times, turning into <em>millisecond</em> or even <strong>second</strong> long affairs.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="putting-it-together">Putting it together<a href="https://oras.land/blog/lightweight-cloud-registry-oras#putting-it-together" class="hash-link" aria-label="Direct link to Putting it together" title="Direct link to Putting it together" translate="no">​</a></h2>
<p>Now that we have the all the parts, it's just a matter of combining them!</p>
<blockquote>
<p>For this tutorial we are using s3 with <code>s3fs</code>, but feel free to use a different provider and follow along!</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://oras.land/blog/lightweight-cloud-registry-oras#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h3>
<ul>
<li class="">Install <a href="https://github.com/oras-project/oras/releases" target="_blank" rel="noopener noreferrer" class="">ORAS</a></li>
<li class="">Install <a href="https://github.com/s3fs-fuse/s3fs-fuse#installation" target="_blank" rel="noopener noreferrer" class="">s3fs</a></li>
<li class="">Obtain an AWS account and create a S3 bucket</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-some-test-artifacts">Creating some test artifacts<a href="https://oras.land/blog/lightweight-cloud-registry-oras#creating-some-test-artifacts" class="hash-link" aria-label="Direct link to Creating some test artifacts" title="Direct link to Creating some test artifacts" translate="no">​</a></h3>
<p>Let us first create some artifacts!</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">echo "Hello World!" &gt; hello.txt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "Goodbye World!" &gt; goodbye.txt</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mounting-your-s3-bucket">Mounting your s3 bucket<a href="https://oras.land/blog/lightweight-cloud-registry-oras#mounting-your-s3-bucket" class="hash-link" aria-label="Direct link to Mounting your s3 bucket" title="Direct link to Mounting your s3 bucket" translate="no">​</a></h3>
<p>Now we should mount our s3 bucket so that we can use it as an oci-layout target.<br>
<!-- -->Checkout <code>s3fs --help</code> for the different ways you can authenticate, here we are using credential profiles.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">mkdir s3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">s3fs my-bucket s3 -o profile=MY_AWS_PROFILE</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-your-new-registry">Using your new "registry"<a href="https://oras.land/blog/lightweight-cloud-registry-oras#using-your-new-registry" class="hash-link" aria-label="Direct link to Using your new &quot;registry&quot;" title="Direct link to Using your new &quot;registry&quot;" translate="no">​</a></h3>
<p>Pushing our newly created artifacts is as easy as:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras push --oci-layout s3/hello:latest hello.txt:text/plain</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">oras push --oci-layout s3/goodbye:latest goodbye.txt:text/plain</span><br></div></code></pre></div></div>
<p>Pulling them is just as simple!</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">rm hello.txt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rm goodbye.txt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">oras pull --oci-layout s3/hello:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">oras pull --oci-layout s3/goodbye:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cat hello.txt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cat goodbye.txt</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="congratulations">Congratulations!<a href="https://oras.land/blog/lightweight-cloud-registry-oras#congratulations" class="hash-link" aria-label="Direct link to Congratulations!" title="Direct link to Congratulations!" translate="no">​</a></h3>
<p><strong>Now you are running your own lightweight OCI registry on the cloud!</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="caveats">Caveats<a href="https://oras.land/blog/lightweight-cloud-registry-oras#caveats" class="hash-link" aria-label="Direct link to Caveats" title="Direct link to Caveats" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="you-cant-delete-yet"><strong>You can't delete yet!</strong><a href="https://oras.land/blog/lightweight-cloud-registry-oras#you-cant-delete-yet" class="hash-link" aria-label="Direct link to you-cant-delete-yet" title="Direct link to you-cant-delete-yet" translate="no">​</a></h3>
<p><strong>You can't delete your artifacts yet!</strong></p>
<p>Currently<sup><a href="https://oras.land/blog/lightweight-cloud-registry-oras#user-content-fn-1-5e6aeb" id="user-content-fnref-1-5e6aeb" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup> you can't delete your local <code>oci-layout</code> artifacts with <code>oras manifest delete</code> or <code>oras blob delete</code></p>
<p>Normally it is the registry's responsibility to garbage collect blobs without any references, but in this case the cli does not have the functionality (yet).</p>
<p>It is still possible to just do <code>rm -rf s3/my-repo</code>, but that is probably not what you want to do.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="concurrency">Concurrency?<a href="https://oras.land/blog/lightweight-cloud-registry-oras#concurrency" class="hash-link" aria-label="Direct link to Concurrency?" title="Direct link to Concurrency?" translate="no">​</a></h3>
<p>Same concurrency rules of your chosen Object Store apply, generally <a href="https://en.wikipedia.org/wiki/Eventual_consistency" target="_blank" rel="noopener noreferrer" class="">last-write-wins</a>. Please check your documentation</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-this-trick-in-your-application">Using this trick in your application<a href="https://oras.land/blog/lightweight-cloud-registry-oras#using-this-trick-in-your-application" class="hash-link" aria-label="Direct link to Using this trick in your application" title="Direct link to Using this trick in your application" translate="no">​</a></h2>
<p>You can use this trick in your applications as well!</p>
<p>Instead of integrating in your application code (hard dependency, vendor lock-in, complicates your interface: "how do I pass in creds?") you instead mount the Object Store in the container and then "just use the file system" (transferable, simple, external, interfaceable)</p>
<p>There are some caveats to this approach and your application might leverage the capabilities of the Native Object Storage API extremely well, but if it's just a simple interaction, why complicate things?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrading-to-registry">Upgrading to Registry<a href="https://oras.land/blog/lightweight-cloud-registry-oras#upgrading-to-registry" class="hash-link" aria-label="Direct link to Upgrading to Registry" title="Direct link to Upgrading to Registry" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws--simple-storage-service-s3-to-zot">AWS  Simple Storage Service (S3) to ZOT<a href="https://oras.land/blog/lightweight-cloud-registry-oras#aws--simple-storage-service-s3-to-zot" class="hash-link" aria-label="Direct link to AWS  Simple Storage Service (S3) to ZOT" title="Direct link to AWS  Simple Storage Service (S3) to ZOT" translate="no">​</a></h3>
<p>You can just point <a href="https://github.com/project-zot/zot/blob/main/examples/README.md#storage-drivers" target="_blank" rel="noopener noreferrer" class="">ZOT</a> at the s3 bucket as it is already expecting an <code>oci-layout</code></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="other">Other<a href="https://oras.land/blog/lightweight-cloud-registry-oras#other" class="hash-link" aria-label="Direct link to Other" title="Direct link to Other" translate="no">​</a></h3>
<p>If you have a "normal" registry you'll need to export all your repos and their tags to that registry</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="script">Script<a href="https://oras.land/blog/lightweight-cloud-registry-oras#script" class="hash-link" aria-label="Direct link to Script" title="Direct link to Script" translate="no">​</a></h4>
<p><em>NOTE: won't work with any repo containing a space or tab</em></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ls -1 s3/ | xargs -P0 -n1 sh -c 'oras repo tags --oci-layout "s3/$1" | xargs -P0 -n1 -I{} oras copy --recursive --from-oci-layout "s3/$1:{}" "yourregistry/$1:{}"' _</span><br></div></code></pre></div></div>
<blockquote>
<p>There is no <code>--oci-layout</code> on <code>oras repo ls</code>, so we are substituting with:
<code>ls -1 s3/</code></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance">Performance<a href="https://oras.land/blog/lightweight-cloud-registry-oras#performance" class="hash-link" aria-label="Direct link to Performance" title="Direct link to Performance" translate="no">​</a></h2>
<p><a href="https://github.com/kahing/goofys" target="_blank" rel="noopener noreferrer" class="">Goofys</a> was the definitive champion utilizing the strengths of a local caching file system with the powers of a remote Object Store, it was the fastest in the cloud and local.</p>
<p><a href="https://github.com/s3fs-fuse/s3fs-fuse" target="_blank" rel="noopener noreferrer" class="">s3fs</a> made a commendable effort and was faster than the native API on small objects, but started to lose performance on the bigger objects.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="findings">Findings<a href="https://oras.land/blog/lightweight-cloud-registry-oras#findings" class="hash-link" aria-label="Direct link to Findings" title="Direct link to Findings" translate="no">​</a></h2>
<p><strong>tl<!-- -->:dr</strong></p>
<p>Local performance:<br>
<!-- -->Goofys made testing very difficult because it so effectively cached and reused objects, but installing it was a pain.<br>
<code>s3fs</code> installed easily, but suffered around 512MiB, was bad at 1Gib, and was awful at 2Gib.</p>
<p>Cloud performance:<br>
<!-- -->Amazing throughout.<br>
<!-- -->Use Goofys.</p>
<blockquote>
<p>Note: <code>goofys</code> is cheating!. It is a caching fs, so the numbers below are not an accurate representation of all use-cases.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="local">Local<a href="https://oras.land/blog/lightweight-cloud-registry-oras#local" class="hash-link" aria-label="Direct link to Local" title="Direct link to Local" translate="no">​</a></h3>
<blockquote>
<p>Done inside WSL Ubuntu over WiFi.</p>
</blockquote>
<p>This test was done over Wifi and was overall pretty slow especially with the bigger objects.
Chunking the artifact did not lead to any substantial speed increases.</p>
<p><code>goofys</code> isn't displayed, but you should try it out yourself!<br>
<!-- -->It's asynchronous update and caching nature is so powerful and led to testing complications.</p>
<p><img decoding="async" loading="lazy" alt="local plot" src="https://oras.land/assets/images/local-plot-86d4a36be40051229b965e52561aeda4.svg" width="2304" height="1236" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws">AWS<a href="https://oras.land/blog/lightweight-cloud-registry-oras#aws" class="hash-link" aria-label="Direct link to AWS" title="Direct link to AWS" translate="no">​</a></h3>
<p>Welp it's WAY faster over here!</p>
<p><code>goofys</code> is an entire order of magnitude faster, but normalized around 2GiB.<br>
<code>s3fs</code> was also faster than native up until about 2GiB.</p>
<p>Chunking the artifacts did not lead to any substantial speed increases... Except for goofys, which showed an upwards of 2x speed increase!</p>
<p><img decoding="async" loading="lazy" alt="aws plot" src="https://oras.land/assets/images/aws-plot-8a8542becea54c60ba0abdfa4c9bffb3.svg" width="2528" height="921" class="img_ev3q"></p>
<blockquote>
<p>AWS2023 has removed the Extra Packages for Enterprise Linux (EPEL) repositories, so I used Debian instead. I used the <code>apt</code> distribution of <code>s3fs</code> and the <code>go</code> install of <code>goofys</code>.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scripts-used">Scripts used<a href="https://oras.land/blog/lightweight-cloud-registry-oras#scripts-used" class="hash-link" aria-label="Direct link to Scripts used" title="Direct link to Scripts used" translate="no">​</a></h2>
<p>Feel free to modify and test how your flavors of fuse drivers stack up!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-libsh">test-lib.sh<a href="https://oras.land/blog/lightweight-cloud-registry-oras#test-libsh" class="hash-link" aria-label="Direct link to test-lib.sh" title="Direct link to test-lib.sh" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#!/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># bucket	- the s3 bucket</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># s3dir		- the s3 mounted directory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># size		- bytes size. e.g. 15MiB, 1GiB, 2MB. should be valid for `head -c `</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># count		- a integer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># datafile	- the file that contains the time information</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># jtag		- a valid `junk` repo tag</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># bucket dir</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">s3fsSetup() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	dirname="$2"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	mkdir -p "$dirname"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	s3fs "$1" "$dirname" -o iam_role; #setup for cloud, you should modify for local testing</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "$dirname"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># bucket dir</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">goofysSetup() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	dirname="$2"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	mkdir -p "$dirname"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	goofys "$1" "$dirname" #setup for cloud, you should modify for local testing</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "$dirname"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># s3dir</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">unmountS3() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	umount "$1" &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	  rmdir "$1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># size</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">genSingle() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	base64 &lt; /dev/random | head -c "$1" &gt; "${1}.junk"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "${1}.junk"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># size count</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">genMulti() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	seq 1 "$2" | xargs -n1 sh -c 'base64 &lt; /dev/random | head -c "$1" &gt; "${1}.${2}.junk"; echo "${1}.${2}.junk"' _ "$1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># &lt;(time)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">time2line() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	grep -Eo '[0-9]+m.+s' | tr '\n' '\t'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># s3dir size</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">singleBlobPush() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	file=$(genSingle "$2")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	oras push --oci-layout "${1}/junk:${2}" "$file"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	rm "$file"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># s3dir size count</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">multiBlobPush() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	files=$(genMulti "$2" "$3")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "$files" | xargs -d'\n' -n"${3}" oras push --oci-layout "${1}/junk:${2}x${3}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "$files" | xargs -d'\n' rm -f</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># datafile</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resetDataFile() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	printf '#%s\t%s\t%s\t%s\t%s\t\n' "type" "sizelabel" "realtime" "usertime" "systime" &gt; "$1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># s3dir jtag datafile</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">timeOrasPull() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    exec 3&gt;&amp;1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	{ time oras pull --oci-layout "${1}/junk:${2}"; } 2&gt;&amp;1 1&gt;&amp;3 | printf '%s\t%s\t%s\n' "${1}" "${2}" "$(cat | time2line)" &gt;&gt; "$3"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	rm -f *.junk</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># bucket jtag datafile</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">timeS3Junk() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	exec 3&gt;&amp;1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	tmpdir=$(mktemp -d)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	{ time { aws s3 cp --recursive "s3://$1/junk/blobs/sha256/" "${tmpdir}/" 1&gt;&amp;1 2&gt;&amp;1 ; } ; } 2&gt;&amp;1 1&gt;&amp;3 | printf '%s\t%s\t%s\n' "aws-cli-s3" "${2}" "$(cat | time2line)" &gt;&gt; "$3"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	rm -rf "$tmpdir"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># s3dir</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">deleteJunkRepo() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  rm -rf "$1/junk"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="oci-testsh">oci-test.sh<a href="https://oras.land/blog/lightweight-cloud-registry-oras#oci-testsh" class="hash-link" aria-label="Direct link to oci-test.sh" title="Direct link to oci-test.sh" translate="no">​</a></h3>
<p>Remember to set the <a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html" target="_blank" rel="noopener noreferrer" class="">AWS ENV Variables</a></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#!/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">. test-lib.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">set -u</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">set -e</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">set -o pipefail</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${S3_BUCKET:="$1"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${DAT_FILE:="orastime.dat"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${S3FS_TDIR:="s3fs3"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${S3FS_TEST:="true"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${S3FS_S3_BUCKET:="$S3_BUCKET"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${GOOFYS_TDIR:="goofys3"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${GOOFYS_TEST:="true"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${GOOFYS_S3_BUCKET:="$S3_BUCKET"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${SINGLE_LIST:="8MiB 16MiB 32MiB 64MiB 128MiB 256MiB 512MiB 1GiB 2GiB"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: "${MULTI_LIST:="16MiBx8 64MiBx8 64MiBx16"}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># time postmessage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sleepy() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "Sleeping for ${1}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	sleep "$1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "$2"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># dir bucket datafile singlelist multilist</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">testit() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	dir="$1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	bucket="$2"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	datfile="$3"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	singlelist=($4)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	multilist=($5)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	# size</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	trippleTimePull() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		s="$1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		echo "Pull 1 Starting..." &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		timeOrasPull "$dir" "$s" "$datfile" &amp;&amp; sleepy 1.3 "Pull 2 Starting..." &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		timeOrasPull "$dir" "$s" "$datfile" &amp;&amp; sleepy 1.3 "Pull 3 Starting..." &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		timeOrasPull "$dir" "$s" "$datfile"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	trippleTimeS3() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		s="$1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		echo "Copy 1 Starting..." &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		timeS3Junk "$bucket" "$s" "$datfile" &amp;&amp; sleepy 1.3 "Copy 2 Starting..." &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		timeS3Junk "$bucket" "$s" "$datfile" &amp;&amp; sleepy 1.3 "Copy 3 Starting..." &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		timeS3Junk "$bucket" "$s" "$datfile"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "Starting: Oras S3 test on ${dir} into ${datfile}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	for size in "${singlelist[@]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		echo "Testing ${size}" &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		singleBlobPush "$dir" "$size" &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		trippleTimePull "$size" &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		trippleTimeS3 "$size" &amp;&amp; echo "Cleaning up..." &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		deleteJunkRepo "$dir"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	for sizexcount in "${multilist[@]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		count="${sizexcount#*x}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		size="${sizexcount%x*}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		echo "Testing ${count} chunks of ${size}" &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		multiBlobPush "$dir" "$size" "$count" &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		trippleTimePull "$sizexcount" &amp;&amp; </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		trippleTimeS3 "$sizexcount" &amp;&amp; echo "Cleaning up..." &amp;&amp;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		deleteJunkRepo "$dir"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if [ "S3FS-TDIR" = "s3fs" ]; then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "IDFK Why but if you make the s3fs directory 's3fs' it breaks"  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	exit 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "Init Data File"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resetDataFile "$DAT_FILE"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if [ "$S3FS_TEST" = "true" ]; then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "Setting up s3fs..."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "$S3FS_S3_BUCKET"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	s3fsSetup "$S3FS_S3_BUCKET" "$S3FS_TDIR" </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "Lets do this..."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	testit "$S3FS_TDIR" "$S3FS_S3_BUCKET" "$DAT_FILE" "$SINGLE_LIST" "$MULTI_LIST"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "Unmounting..."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	unmountS3 "$S3FS_TDIR" </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if [ "$GOOFYS_TEST" = "true" ]; then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "Setting up goofys..."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	goofysSetup "$GOOFYS_S3_BUCKET" "$GOOFYS_TDIR"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "Lets do this..."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	testit "$GOOFYS_TDIR" "$GOOFYS_S3_BUCKET" "$DAT_FILE" "$SINGLE_LIST" "$MULTI_LIST"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	echo "Unmounting..."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">	unmountS3 "$GOOFYS_TDIR" </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://oras.land/blog/lightweight-cloud-registry-oras#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-5e6aeb">
<p>It will probably be available in the next releases <code>&gt; v1.1.0</code>. See this <a href="https://github.com/oras-project/oras/pull/1197" target="_blank" rel="noopener noreferrer" class="">merged</a> issue. <a href="https://oras.land/blog/lightweight-cloud-registry-oras#user-content-fnref-1-5e6aeb" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>oras</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[ORAS Welcomes New Owners, Maintainers, and Thanks Emeritus Owners]]></title>
            <link>https://oras.land/blog/welcome-new-oras-owners</link>
            <guid>https://oras.land/blog/welcome-new-oras-owners</guid>
            <pubDate>Fri, 24 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Welcomes new owners and maintainers]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="welcomes-new-owners-and-maintainers">Welcomes new owners and maintainers<a href="https://oras.land/blog/welcome-new-oras-owners#welcomes-new-owners-and-maintainers" class="hash-link" aria-label="Direct link to Welcomes new owners and maintainers" title="Direct link to Welcomes new owners and maintainers" translate="no">​</a></h2>
<p>With a supermajority vote from the existing ORAS Organization Owners, we are excited to announce that <a href="https://github.com/TerryHowe" target="_blank" rel="noopener noreferrer" class="">Terry Howe</a> and <a href="https://github.com/sabre1041" target="_blank" rel="noopener noreferrer" class="">Andrew Block</a> have been accepted as new ORAS Organization owners. In addition, <a href="https://github.com/qweeah" target="_blank" rel="noopener noreferrer" class="">Billy Zha</a> and <a href="https://github.com/feynmanzhou" target="_blank" rel="noopener noreferrer" class="">Feynman Zhou</a> been accepted as ORAS subproject maintainers.</p>
<p>Terry has been actively contributing to ORAS since Dec 2022 and has been nominated to a sub-project maintainer on Feb 21. He raised 19 PRs to multiple ORAS repositories includes ORAS CLI, ORAS-go, and ORAS-www in the last quarter. He also reviewed Pull Request actively and left 126 comments in the same period.</p>
<p>Andrew worked frequently with the ORAS community members to build functionality into the v1 branch for which Helm makes use of as well as to provide test coverage and features to the current v2 main branch. He also saw how the capabilities produced by ORAS could be used outside of the Helm ecosystem, such as in <a href="https://emporous.io/" target="_blank" rel="noopener noreferrer" class="">Emporous</a> (formerly called Universal Object Reference UOR) as a way to manage content within OCI registries. He also contributed to several features and bug fixes for ORAS-go.</p>
<p>Billy has contributed 103 PRs to the main branch and reviewed most the PRs of the ORAS CLI repository in the last 9 months. He also presented several demos and proposals in the ORAS community meeting.</p>
<p>Feynman has been actively contributing to the ORAS-www and ORAS CLI repositories in the past 10 months. He raised 11 Pull Requests and helped review several PRs in multiple repositories. He is also one of the meeting chair who organizes the ORAS community meeting in the last 10 months.</p>
<p>They have demonstrated their commitment and passion for the project. We are grateful for their contributions and leadership, and we look forward to working with them as owners of ORAS.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thanks-emeritus-owners">Thanks Emeritus Owners<a href="https://oras.land/blog/welcome-new-oras-owners#thanks-emeritus-owners" class="hash-link" aria-label="Direct link to Thanks Emeritus Owners" title="Direct link to Thanks Emeritus Owners" translate="no">​</a></h2>
<p>We also want to thank <a href="https://github.com/deitch" target="_blank" rel="noopener noreferrer" class="">Avi Deitcher</a> and <a href="https://github.com/jdolitsky" target="_blank" rel="noopener noreferrer" class="">Josh Dolitsky</a> who have stepped down from their roles as owners of ORAS. Avi was one of the founding members of ORAS who helped shape its vision and direction. Josh was also one of the founding members of ORAS who instrumental in developing many features of ORAS, such as artifact reference types, push/pull options, etc. They have both moved to emeritus status but will continue to support ORAS as advisors. We appreciate their dedication and service to the project, and we wish them all the best for their future endeavors.</p>]]></content:encoded>
            <category>oras</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[ORAS 0.15 - A Fully Functional OCI Registry Client]]></title>
            <link>https://oras.land/blog/oras-0.15-a-fully-functional-registry-client</link>
            <guid>https://oras.land/blog/oras-0.15-a-fully-functional-registry-client</guid>
            <pubDate>Tue, 21 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[The OCI Registry As Storage (ORAS) project maintainers announced two releases of v0.15 for the ORAS CLI recently. ORAS v0.15.0 introduces four new top-level commands and new options to manage tags and repositories for advanced use cases. Three weeks later, ORAS 0.15.1 also released with a few known bug fixes. Since the release of v0.15, ORAS CLI has evolved into a fully functional OCI registry client.]]></description>
            <content:encoded><![CDATA[<p>The <a href="https://oras.land/" target="_blank" rel="noopener noreferrer" class="">OCI Registry As Storage (ORAS)</a> project maintainers announced two releases of v0.15 for the ORAS CLI recently. ORAS <a href="https://github.com/oras-project/oras/releases/tag/v0.15.0" target="_blank" rel="noopener noreferrer" class="">v0.15.0</a> introduces four new top-level commands and new options to manage tags and repositories for advanced use cases. Three weeks later, <a href="https://github.com/oras-project/oras/releases/tag/v0.15.1" target="_blank" rel="noopener noreferrer" class="">ORAS 0.15.1</a> also released with a few known bug fixes. Since the release of v0.15, ORAS CLI has evolved into a fully functional OCI registry client.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-oras-015">What's new in ORAS 0.15<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#whats-new-in-oras-015" class="hash-link" aria-label="Direct link to What's new in ORAS 0.15" title="Direct link to What's new in ORAS 0.15" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt=" What&amp;#39;s new in ORAS 0.15" src="https://oras.land/assets/images/what's-new-in-oras-0.15-4a708162c19aa15721ad59b393dd1aab.png" width="2139" height="912" class="img_ev3q"></p>
<p>As ORAS has been adopted by more and more OCI implementors and registry vendors, we have seen increased community requirements in providing fine-grained capabilities to alter the content of OCI supply chain artifacts. ORAS 0.15 now supports granular blob and manifest operations for artifacts within the registry. Please see the <a href="https://github.com/oras-project/oras/releases/tag/v0.15.0" target="_blank" rel="noopener noreferrer" class="">Release Notes</a> for details.</p>
<p>This blog post will demonstrate how to use ORAS CLI v0.15 to convert a Docker image stored in Docker Hub into an OCI image，then push it to the Distribution registry.</p>
<p><img decoding="async" loading="lazy" alt="convert image workflow" src="https://oras.land/assets/images/convert-image-4d94aec78d8025e5d750b88b5166d1bc.png" width="2501" height="1064" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ul>
<li class="">Install <a href="https://github.com/oras-project/oras/releases/tag/v0.15.1" target="_blank" rel="noopener noreferrer" class="">ORAS 0.15.1</a></li>
<li class="">Install <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer" class="">Docker</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="run-a-distribution-registry-locally">Run a Distribution registry locally<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#run-a-distribution-registry-locally" class="hash-link" aria-label="Direct link to Run a Distribution registry locally" title="Direct link to Run a Distribution registry locally" translate="no">​</a></h2>
<p>Run a local instance of the CNCF Distribution Registry, with ORAS Artifacts support (Note: OCI Artifact support is coming soon):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run -d -p 5000:5000 ghcr.io/oras-project/registry:v1.0.0-rc.4</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fetch-and-view-the-manifest-of-a-sample-docker-image">Fetch and view the manifest of a sample Docker image<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#fetch-and-view-the-manifest-of-a-sample-docker-image" class="hash-link" aria-label="Direct link to Fetch and view the manifest of a sample Docker image" title="Direct link to Fetch and view the manifest of a sample Docker image" translate="no">​</a></h2>
<p>Set the environment variable as below.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker_digest="sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4"</span><br></div></code></pre></div></div>
<p>Fetch the manifest and export it to a JSON file.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras manifest fetch docker.io/library/hello-world@$docker_digest &gt; docker.manifest.json</span><br></div></code></pre></div></div>
<p>View the generated manifest file.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cat docker.manifest.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "schemaVersion": 2,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "config": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "mediaType": "application/vnd.docker.container.image.v1+json",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "size": 1469,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "digest": "sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "layers": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "size": 2479,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "digest": "sha256:2db29710123e3e53a794f2694094b9b4338aa9ee5c40b930cb8063a1be392c54"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fetch-and-push-a-blob">Fetch and push a blob<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#fetch-and-push-a-blob" class="hash-link" aria-label="Direct link to Fetch and push a blob" title="Direct link to Fetch and push a blob" translate="no">​</a></h2>
<p>Per <a href="https://github.com/opencontainers/distribution-spec/blob/main/spec.md#push" target="_blank" rel="noopener noreferrer" class="">distribution-spec</a> ,the blobs making up the object are uploaded first, and the manifest last. So we should fetch a blob from Docker Hub and push it to local registry, then upload the manifest.</p>
<p>Set the environment variable as below.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">config_digest=$(cat docker.manifest.json | jq -r .config.digest)</span><br></div></code></pre></div></div>
<p>Fetch a config blob to a local file from a sample Docker image:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras blob fetch docker.io/library/hello-world@$config_digest --output config-blob.json</span><br></div></code></pre></div></div>
<p>Then push this blob file to a new repository in a CNCF Distribution registry:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras blob push localhost:5000/oras-distribution/hello-world config-blob.json</span><br></div></code></pre></div></div>
<p>Similarly, fetch the layer blob and push it to the Distribution registry:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">layer_digest=$(cat docker.manifest.json | jq -r .layers[].digest)</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras blob fetch docker.io/library/hello-world@$layer_digest --output layer-blob.json</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras blob push localhost:5000/oras-distribution/hello-world layer-blob.json</span><br></div></code></pre></div></div>
<p>Push it to the sample repository with the blob file.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras blob push localhost:5000/oras-distribution/hello-world layer-blob.json</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fetch-and-push-a-manifest">Fetch and push a manifest<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#fetch-and-push-a-manifest" class="hash-link" aria-label="Direct link to Fetch and push a manifest" title="Direct link to Fetch and push a manifest" translate="no">​</a></h2>
<p>Similar to blob operations above, fetch a manifest from a Docker image stored in Docker Hub and export it to a JSON file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras manifest fetch docker.io/library/hello-world@sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4 --output hello-manifest.json</span><br></div></code></pre></div></div>
<p>Modify the manifest file <code>hello-manifest.json</code> from Docker to OCI type in each <code>mediatype</code> field of config and layer:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token property" style="color:#36acaa">"schemaVersion"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.manifest.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token property" style="color:#36acaa">"config"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.config.v1+json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1469</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token property" style="color:#36acaa">"layers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token property" style="color:#36acaa">"mediaType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/vnd.oci.image.layer.v1.tar+gzip"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token property" style="color:#36acaa">"size"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2479</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token property" style="color:#36acaa">"digest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sha256:2db29710123e3e53a794f2694094b9b4338aa9ee5c40b930cb8063a1be392c54"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Push the modified manifest file to the repository in the Distribution registry. It will also create a new repository automatically:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras manifest push localhost:5000/oras-distribution/hello-world:latest hello-manifest.json</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="validate-the-new-image">Validate the new image<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#validate-the-new-image" class="hash-link" aria-label="Direct link to Validate the new image" title="Direct link to Validate the new image" translate="no">​</a></h2>
<p>View the manifest of this Docker image from the Distribution registry, you will find all <code>mediatype</code> are changed to OCI type:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras manifest fetch localhost:5000/oras-distribution/hello-world:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   "schemaVersion": 2,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   "mediaType": "application/vnd.oci.image.manifest.v1+json",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   "config": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "mediaType": "application/vnd.oci.image.config.v1+json",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "size": 1469,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "digest": "sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   "layers": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "size": 2479,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "digest": "sha256:2db29710123e3e53a794f2694094b9b4338aa9ee5c40b930cb8063a1be392c54"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>Run and validate the new OCI image:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run localhost:5000/oras-distribution/hello-world:latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Hello from Docker!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">This message shows that your installation appears to be working correctly.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">To generate this message, Docker took the following steps:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> 1. The Docker client contacted the Docker daemon.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    (amd64)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> 3. The Docker daemon created a new container from that image which runs the</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    executable that produces the output you are currently reading.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> 4. The Docker daemon streamed that output to the Docker client, which sent it</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    to your terminal.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">To try something more ambitious, you can run an Ubuntu container with:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> $ docker run -it ubuntu bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Share images, automate workflows, and more with a free Docker ID:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> https://hub.docker.com/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">For more examples and ideas, visit:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> https://docs.docker.com/get-started/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>It turns out the conversion works.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-multi-tagging-and-view-the-tags">Try multi-tagging and view the tags<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#try-multi-tagging-and-view-the-tags" class="hash-link" aria-label="Direct link to Try multi-tagging and view the tags" title="Direct link to Try multi-tagging and view the tags" translate="no">​</a></h2>
<p>Tag the manifest with 'latest' to 'v1.0.0', 'v2.0.0':</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras tag localhost:5000/oras-distribution/hello-world:latest v1.0.0 v2.0.0</span><br></div></code></pre></div></div>
<p>View the newly created tags in the sample repository:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras repo tags localhost:5000/oras-distribution/hello-world</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">v1.0.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">v2.0.0</span><br></div></code></pre></div></div>
<p>Congratulations! You have experienced all new top-level commands in ORAS CLI 0.15.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next-for-oras">What's next for ORAS<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#whats-next-for-oras" class="hash-link" aria-label="Direct link to What's next for ORAS" title="Direct link to What's next for ORAS" translate="no">​</a></h2>
<p>Recently the OCI and ORAS maintainers submitted a proposal to <a href="https://github.com/opencontainers/image-spec/pull/934" target="_blank" rel="noopener noreferrer" class="">unify the ORAS Artifact manifest with an OCI Artifact manifest (pr-934)</a> and <a href="https://github.com/opencontainers/distribution-spec/pull/335" target="_blank" rel="noopener noreferrer" class="">pr-335</a>, to consolidate the specs. These changes provide adds new capabilities to OCI registries while maintaining the ability to function on registries that don't yet support the <a href="https://github.com/opencontainers/image-spec/blob/main/artifact.md" target="_blank" rel="noopener noreferrer" class="">new Artifact manifest</a>. This proposal originates from the <a href="https://github.com/oras-project/artifacts-spec" target="_blank" rel="noopener noreferrer" class="">ORAS artifact </a> and has been accepted by the OCI group. The OCI group also cut a new release in the distribution-spec and image-spec supporting Reference Types, enabling a breadth of supply chain evidence to benefit from existing registries.</p>
<p>In <a href="https://github.com/oras-project/oras/milestone/9" target="_blank" rel="noopener noreferrer" class="">ORAS CLI 0.16</a> and <a href="https://github.com/oras-project/oras-go/milestone/10" target="_blank" rel="noopener noreferrer" class="">ORAS-go v2.0.0-rc.4</a>, we'll add support for the <a href="https://github.com/opencontainers/image-spec/blob/main/artifact.md" target="_blank" rel="noopener noreferrer" class="">OCI artifact spec</a> will be the most significant plan and is targeted to be released at the end of October. You can find the migration proposal from this <a href="https://hackmd.io/zLnCh8WRQDG-3S_jXR626g?view" target="_blank" rel="noopener noreferrer" class="">doc</a>. See also the <a href="https://github.com/oras-project/community/blob/main/Roadmap.md" target="_blank" rel="noopener noreferrer" class="">ORAS Roadmap</a> for more detailed future plans.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-the-oras-community">Join the ORAS community<a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client#join-the-oras-community" class="hash-link" aria-label="Direct link to Join the ORAS community" title="Direct link to Join the ORAS community" translate="no">​</a></h2>
<p>The ORAS Project was accepted in June 2021 as a Cloud Native Computing Foundation (CNCF) Sandbox project. It is important that we hear from the community as we advance the artifact-spec capability; if you maintain or are implementing a container registry, we are particularly interested in your feedback. Working together, we can improve supply chain artifact security in the cloud native ecosystem.</p>
<ul>
<li class=""><a href="https://x.com/intent/follow?screen_name=orasproject" target="_blank" rel="noopener noreferrer" class="">Follow ORAS on X</a></li>
<li class=""><a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Join the Slack channel in CNCF</a> and find us at <strong>oras</strong> channel</li>
</ul>]]></content:encoded>
            <category>oras</category>
            <category>artifact</category>
        </item>
        <item>
            <title><![CDATA[Bundle, test and deploy Gatekeeper policies as OCI image]]></title>
            <link>https://oras.land/blog/gatekeeper-policies-as-oci-image</link>
            <guid>https://oras.land/blog/gatekeeper-policies-as-oci-image</guid>
            <pubDate>Mon, 13 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[ORAS (OCI Registry As Storage) is an important tool out there for working with OCI artifacts and OCI registries. As one of the users and advocates of ORAS, I witnessed the growing trend in both user adoption and contributions in 2022. In this blog post I will share an end-to-end scenario with OPA Gatekeeper policies and ORAS, from including the steps from bundling to deployment.]]></description>
            <content:encoded><![CDATA[<p><a href="https://oras.land/" target="_blank" rel="noopener noreferrer" class="">ORAS (OCI Registry As Storage)</a> is an important tool out there for working with OCI artifacts and OCI registries. As one of the users and advocates of ORAS, I witnessed the <a href="https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023/" target="_blank" rel="noopener noreferrer" class="">growing trend in both user adoption and contributions in 2022</a>. In this blog post I will share an end-to-end scenario with OPA Gatekeeper policies and ORAS, from including the steps from bundling to deployment.</p>
<p>Policies are rules expressed in YAML that not only afford meeting governance requirements, but also improve the security of Kubernetes workloads and clusters. Policy engines like <a href="https://open-policy-agent.github.io/gatekeeper/website/docs/" target="_blank" rel="noopener noreferrer" class="">OPA Gatekeeper</a>, <a href="https://kyverno.io/" target="_blank" rel="noopener noreferrer" class="">Kyverno</a> or even the new Kubernetes's <a href="https://kubernetes.io/blog/2022/12/20/validating-admission-policies-alpha/" target="_blank" rel="noopener noreferrer" class="">Validating Admission Policies</a> feature help write and enforce such policies. Once the policies are written, however, how do we easily and securely share them with different projects and teams? How do we deploy them across the fleet of clusters? How do we evaluate them as early as possible in CI/CD pipelines?</p>
<p>In this blog post we will demonstrate how to bundle and share Gatekeeper policies as an OCI image using the <a href="https://oras.land/cli/" target="_blank" rel="noopener noreferrer" class="">ORAS</a> command line client, how to evaluate any Kubernetes manifests against this OCI image with the <a href="https://open-policy-agent.github.io/gatekeeper/website/docs/gator/" target="_blank" rel="noopener noreferrer" class=""><code>gator</code></a> command line client, and how to deploy this OCI image in Kubernetes clusters, in a GitOps way.</p>
<p><img decoding="async" loading="lazy" alt="Flow between ORAS, OCI registry, Gatekeeper and Config Sync" src="https://oras.land/assets/images/overview-flow-941417cceea00239cdd50290cc8c7dc5.png" width="1884" height="477" class="img_ev3q"></p>
<p><em>While we use <a href="https://cloud.google.com/artifact-registry" target="_blank" rel="noopener noreferrer" class="">Google Artifact Registry</a> as the OCI registry for this example, you can use <a href="https://oras.land/implementors/#registries-supporting-oci-artifacts" target="_blank" rel="noopener noreferrer" class="">any registry supporting OCI artifacts</a>. For the GitOps tool, we are using the OSS project: <a href="https://github.com/GoogleContainerTools/kpt-config-sync" target="_blank" rel="noopener noreferrer" class="">Config Sync</a>, and you can also use it as part of the <a href="https://cloud.google.com/anthos/config-management" target="_blank" rel="noopener noreferrer" class="">Anthos Config Management</a> service or even use other GitOps tools supporting OCI images like <a href="https://fluxcd.io/flux/cheatsheets/oci-artifacts/" target="_blank" rel="noopener noreferrer" class="">FluxCD</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-a-gatekeeper-policy">Create a Gatekeeper policy<a href="https://oras.land/blog/gatekeeper-policies-as-oci-image#create-a-gatekeeper-policy" class="hash-link" aria-label="Direct link to Create a Gatekeeper policy" title="Direct link to Create a Gatekeeper policy" translate="no">​</a></h2>
<p>Let's create a <a href="https://open-policy-agent.github.io/gatekeeper/website/docs/howto" target="_blank" rel="noopener noreferrer" class="">Gatekeeper policy</a> composed by one <code>Constraint</code> and one <code>ConstraintTemplate</code> that will be leveraged throughout this blog post.</p>
<p>In this example, we are making sure that any non-system namespaces is leveraging the <a href="https://kubernetes.io/docs/concepts/security/pod-security-admission/" target="_blank" rel="noopener noreferrer" class="">Pod Security Admission</a> feature to enforce the <a href="https://kubernetes.io/docs/concepts/security/pod-security-standards/" target="_blank" rel="noopener noreferrer" class="">Pod Security Standards</a>.</p>
<p>Create a dedicated folder for the associated files:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">mkdir -p policies</span><br></div></code></pre></div></div>
<p>Define the <code>ConstraintTemplate</code> to ensure that the Kubernetes resources contain specified labels:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF&gt; policies/k8srequiredlabels.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">apiVersion: templates.gatekeeper.sh/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind: ConstraintTemplate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name: k8srequiredlabels</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  crd:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      names:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        kind: K8sRequiredLabels</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      validation:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        openAPIV3Schema:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          type: object</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          properties:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            labels:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              description: A list of labels and values the object must specify.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              items:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                properties:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  allowedRegex:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    description: If specified, a regular expression the annotation's</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                      value must match. The value must contain at least one match</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                      for the regular expression.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    type: string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  key:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    description: The required label.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    type: string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                type: object</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              type: array</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  targets:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - target: admission.k8s.gatekeeper.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      rego: |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        package k8srequiredlabels</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        violation[{"msg": msg, "details": {"missing_labels": missing}}] {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           provided := {label | input.review.object.metadata.labels[label]}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           required := {label | label := input.parameters.labels[_].key}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           missing := required - provided</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           count(missing) &gt; 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           msg := sprintf("You must provide labels: %v for the %s: %s.", [missing, input.review.object.kind, input.review.object.metadata.name])</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        violation[{"msg": msg}] {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           value := input.review.object.metadata.labels[key]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           expected := input.parameters.labels[_]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           expected.key == key</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           expected.allowedRegex != ""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           not re_match(expected.allowedRegex, value)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           msg := sprintf("Label %s: %s does not satisfy allowed regex: %s", [key, value, expected.allowedRegex])</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></div></code></pre></div></div>
<p>Define the associated <code>Constraint</code> for the <code>Namespaces</code> which must have the label <code>pod-security.kubernetes.io/enforce</code> as the key and either <code>baseline</code> or <code>restricted</code> as the value:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF&gt; policies/ns-must-have-pss-label.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">apiVersion: constraints.gatekeeper.sh/v1beta1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind: K8sRequiredLabels</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name: ns-must-have-pss-label</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  enforcementAction: deny</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  match:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    kinds:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      - apiGroups:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        - ""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        kinds:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        - "Namespace"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    excludedNamespaces:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - config-management-monitoring</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - config-management-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - gatekeeper-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - kube-node-lease</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - kube-public</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - kube-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - resource-group-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  parameters:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    labels:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - key: pod-security.kubernetes.io/enforce</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      allowedRegex: (baseline|restricted)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-this-policy-with-local-files">Test this policy with local files<a href="https://oras.land/blog/gatekeeper-policies-as-oci-image#test-this-policy-with-local-files" class="hash-link" aria-label="Direct link to Test this policy with local files" title="Direct link to Test this policy with local files" translate="no">​</a></h2>
<p>Define a <code>Namespace</code> without the required label.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF &gt; namespace-test.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">apiVersion: v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind: Namespace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name: test</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></div></code></pre></div></div>
<p>Let’s now locally test this <code>Namespace</code> against this policy with the <code>gator</code> CLI. This client makes it very convenient to test policies without any Kubernetes cluster!</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">gator test \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   --filename namespace-test.yaml \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   --filename policies/</span><br></div></code></pre></div></div>
<p>Output similar to:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">["ns-must-have-pss-label"] Message: "You must provide labels: {\"pod-security.kubernetes.io/enforce\"} for the Namespace: test."</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="push-the-gatekeeper-policy-as-oci-image-to-artifact-registry">Push the Gatekeeper policy as OCI image to Artifact Registry<a href="https://oras.land/blog/gatekeeper-policies-as-oci-image#push-the-gatekeeper-policy-as-oci-image-to-artifact-registry" class="hash-link" aria-label="Direct link to Push the Gatekeeper policy as OCI image to Artifact Registry" title="Direct link to Push the Gatekeeper policy as OCI image to Artifact Registry" translate="no">​</a></h2>
<p>Assuming we already have a <a href="https://cloud.google.com/artifact-registry/docs/repositories/create-repos" target="_blank" rel="noopener noreferrer" class="">Google Artifact Registry repository</a> <code>ARTIFACT_REGISTRY_REPO_NAME</code> in the region <code>REGION</code> and project <code>PROJECT_ID</code>.</p>
<p>Login to Artifact Registry:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">gcloud auth configure-docker ${REGION}-docker.pkg.dev</span><br></div></code></pre></div></div>
<p>Push the Gatekeeper policy as OCI image in Google Artifact Registry repository with ORAS:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras push \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_REPO_NAME}/my-policies:1.0.0 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    policies/</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><code>oras push</code> with the <code>policies/</code> folder will do an archive of its files.</p></div></div>
<p>See that the OCI image has been uploaded in the Google Artifact Registry repository:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">gcloud artifacts docker images list ${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_REPO_NAME}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-this-policy-with-the-remote-oci-image">Test this policy with the remote OCI image<a href="https://oras.land/blog/gatekeeper-policies-as-oci-image#test-this-policy-with-the-remote-oci-image" class="hash-link" aria-label="Direct link to Test this policy with the remote OCI image" title="Direct link to Test this policy with the remote OCI image" translate="no">​</a></h2>
<p>Let’s now locally test the <code>Namespace</code> created earlier against this policy as remote OCI image with the gator CLI. It is very convenient to share and evaluate your policies in different places (i.e. locally, during Continuous Integration pipelines, etc.)!</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">gator test \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   --filename namespace-test.yaml \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   --image ${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_REPO_NAME}/my-policies:1.0.0</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Since <a href="https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.11.0" target="_blank" rel="noopener noreferrer" class=""><code>gator</code> version 3.11.0</a>, the <code>--image</code> parameter has been added! We are leveraging this feature instead of pointing to the local files like we did previously with <code>--filename policies/</code></p></div></div>
<p>Output similar to:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">["ns-must-have-pss-label"] Message: "You must provide labels: {\"pod-security.kubernetes.io/enforce\"} for the Namespace: test."</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploy-this-oci-image-with-config-sync">Deploy this OCI image with Config Sync<a href="https://oras.land/blog/gatekeeper-policies-as-oci-image#deploy-this-oci-image-with-config-sync" class="hash-link" aria-label="Direct link to Deploy this OCI image with Config Sync" title="Direct link to Deploy this OCI image with Config Sync" translate="no">​</a></h2>
<p>Assuming we already have a Kubernetes cluster where both <a href="https://github.com/GoogleContainerTools/kpt-config-sync/blob/main/docs/installation.md" target="_blank" rel="noopener noreferrer" class="">Config Sync</a> and <a href="https://open-policy-agent.github.io/gatekeeper/website/docs/install" target="_blank" rel="noopener noreferrer" class="">Gatekeeper</a> should be installed.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt; EOF | kubectl apply -f -</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">apiVersion: configsync.gke.io/v1beta1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind: RootSync</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name: root-sync-policies</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  namespace: config-management-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sourceFormat: unstructured</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sourceType: oci</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  oci:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    image: ${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_REPO_NAME}/my-policies:1.0.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    dir: .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    auth: none</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Here we are assuming that the OCI image is publicly exposed (<code>auth: none</code>) to simplify the flow of this blog post. A more secure setup can be found <a href="https://medium.com/google-cloud/deploying-gatekeeper-policies-as-oci-artifacts-the-gitops-way-e1233429ae2" target="_blank" rel="noopener noreferrer" class="">here</a> showing how to privately access the Google Artifact Registry repository via Workload Identity.</p></div></div>
<p>Verify that the <code>Constraint</code> and <code>ConstraintTemplate</code> are actually deployed:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get constraints</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get constrainttemplates</span><br></div></code></pre></div></div>
<p>And voilà! That’s how easy it is to deploy Gatekeeper policies as OCI image in a GitOps way. Congrats!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-this-policy-in-the-cluster">Test this policy in the cluster<a href="https://oras.land/blog/gatekeeper-policies-as-oci-image#test-this-policy-in-the-cluster" class="hash-link" aria-label="Direct link to Test this policy in the cluster" title="Direct link to Test this policy in the cluster" translate="no">​</a></h2>
<p>Let’s now try to deploy the <code>Namespace</code> defined earlier:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f namespace-test.yaml</span><br></div></code></pre></div></div>
<p>Output similar to:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Error from server (Forbidden): error when creating "namespace-test.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [ns-must-have-pss-label] You must provide labels: {"pod-security.kubernetes.io/enforce"} for the Namespace: test.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thats-a-wrap">That's a wrap!<a href="https://oras.land/blog/gatekeeper-policies-as-oci-image#thats-a-wrap" class="hash-link" aria-label="Direct link to That's a wrap!" title="Direct link to That's a wrap!" translate="no">​</a></h2>
<p>In this article, we were able to package Gatekeeper policies as an OCI image and push it to an OCI Registry, thanks to ORAS. Then, we were able to leverage the new OCI image parameter of <code>gator test</code> command in order to shift-left the evaluation of these policies against any Kubernetes resources outside of an actual cluster. Finally, we deployed the Gatekeeper policies as OCI image in a GitOps way.</p>
<p>The continuous reconciliation of GitOps reconciles between the desired state, now stored in an OCI registry, with the actual state, running in Kubernetes. Gatekeeper policies as OCI images are now just seen like any container images for your Kubernetes clusters as they are pulled from OCI registries. This continuous reconciliation from OCI registries, not interacting with Git, has a lot of benefits in terms of scalability, performance and security as you will be able to configure very fine grained access to your OCI images, across the fleet of your clusters.</p>
<p><em>For a more complete tutorial illustrating this flow with Config Sync and Policy Controller as part of the Anthos Config Management service with Google Kubernetes Engine (GKE), you could <a href="https://medium.com/google-cloud/deploying-gatekeeper-policies-as-oci-artifacts-the-gitops-way-e1233429ae2" target="_blank" rel="noopener noreferrer" class="">check this other blog post out</a>.</em></p>]]></content:encoded>
            <category>oras</category>
        </item>
        <item>
            <title><![CDATA[ORAS - Looking back on 2022 and forward to 2023]]></title>
            <link>https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023</link>
            <guid>https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023</guid>
            <pubDate>Fri, 13 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[ORAS is a tool for working with OCI artifacts and OCI registries. It allows you to distribute OCI artifacts across OCI Registries. ORAS was established and open-sourced in Dec 2018 and joined CNCF as a Sandbox project in June 2021.]]></description>
            <content:encoded><![CDATA[<p>ORAS is a tool for working with OCI artifacts and OCI registries. It allows you to distribute OCI artifacts across OCI Registries. ORAS was established and open-sourced in Dec 2018 and joined CNCF as a Sandbox project in June 2021.</p>
<p>As you can see, ORAS has a long history and is still growing since it has an active community behind it. I was fortunate to join the ORAS community as a release manager in May 2022 and growing with the project this year. So I write this article to share the growth of the active community and project iteration that I witnessed in 2022. Let’s look back at what’s been happening this year and what we can expect in 2023 and beyond.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="moving-fast-with-monthly-release-cadence">Moving fast with monthly release cadence<a href="https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023#moving-fast-with-monthly-release-cadence" class="hash-link" aria-label="Direct link to Moving fast with monthly release cadence" title="Direct link to Moving fast with monthly release cadence" translate="no">​</a></h2>
<p>ORAS provides an OCI registry client <a href="https://oras.land/docs/CLI/installation" target="_blank" rel="noopener noreferrer" class="">ORAS CLI</a> with functional-rich command sets that users can benefit from, while developers can build their own clients on top of one of the&nbsp;<a href="https://oras.land/docs/Client_Libraries/overview" target="_blank" rel="noopener noreferrer" class="">ORAS client libraries</a> including Golang and Python libraries.</p>
<p>We are following a monthly release cadence to ensure fast iteration so that we can get feedback and detect problems from the community and then fix them efficiently.</p>
<ul>
<li class="">ORAS CLI has 4 Minor releases and 2 Patch releases in 2022 and evolved into a powerful and easy-to-use OCI registry client. It supported the OCI artifact manifest and complied with the OCI v1.1 Specifications in the latest release</li>
<li class="">ORAS-go has shifted the focus and feature development from v1 to v2 this year. It has <a href="https://github.com/oras-project/oras-go/releases" target="_blank" rel="noopener noreferrer" class="">15 releases</a> and recently announced the last RC (ORAS v2.0.0-RC.6) release. In contrast to v1, v2 brings more unified interfaces, notably fewer dependencies, higher test coverage, better documentation, etc. For those who are still relying on v1, don’t worry about its deprecation at this moment as v1 is still under maintenance. But it’s highly recommended to give v2 a try and you can expect a stable v2.0.0 to be available in Jan 2023.</li>
<li class="">Similar to ORAS-go, ORAS-py is a Python SDK for ORAS. It was established and contributed by <a href="https://github.com/vsoch" target="_blank" rel="noopener noreferrer" class="">Vanessa</a> starting in May 2022. Thanks to Vanessa,  ORAS-py delivered <a href="https://github.com/oras-project/oras-py/releases" target="_blank" rel="noopener noreferrer" class="">10 releases</a> and a well-organized <a href="https://oras-project.github.io/oras-py/index.html" target="_blank" rel="noopener noreferrer" class="">API and user documentation</a> in 2022.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-active-engagement-in-the-community">More active engagement in the community<a href="https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023#more-active-engagement-in-the-community" class="hash-link" aria-label="Direct link to More active engagement in the community" title="Direct link to More active engagement in the community" translate="no">​</a></h2>
<p>As some users might be aware, the ORAS project has an obvious growing trend in both user adoption and contributions starting from the middle of 2022. We are working to properly document the contribution and development process.  Let’s see the remarkable statistics in 2022 as follows. You can also check out the detailed dashboards <a href="https://oras.devstats.cncf.io/d/8/dashboards?orgId=1&amp;refresh=15m&amp;search=open" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<ul>
<li class="">A total of <a href="https://oras.devstats.cncf.io/d/22/prs-authors-table?orgId=1&amp;var-period_name=Last%20year&amp;var-repogroup_name=All&amp;kiosk&amp;viewPanel=1" target="_blank" rel="noopener noreferrer" class="">48 contributors</a> submitted Pull Requests to ORAS repositories</li>
<li class="">On average, there are&nbsp;<a href="https://oras.devstats.cncf.io/d/74/contributions-chart?orgId=1&amp;var-period=m&amp;var-metric=contributions&amp;var-repogroup_name=All&amp;var-country_name=All&amp;var-company_name=All&amp;var-company=all&amp;from=now-1y&amp;to=now" target="_blank" rel="noopener noreferrer" class="">around 764 contributions and 25 contributors per month</a> and&nbsp;contained within&nbsp;<a href="https://oras.devstats.cncf.io/d/24/prs-merged-repository-groups?orgId=1&amp;var-period=m&amp;var-repogroups=All" target="_blank" rel="noopener noreferrer" class="">34 merged PRs per month</a></li>
<li class="">These contributors come from&nbsp;<a href="https://oras.devstats.cncf.io/d/5/companies-table?orgId=1&amp;var-period_name=Last%20year&amp;var-metric=contributions" target="_blank" rel="noopener noreferrer" class="">35 companies</a></li>
<li class="">All&nbsp;<a href="https://oras.devstats.cncf.io/d/3/stars-and-forks-by-repository?orgId=1&amp;from=now-1y&amp;to=now" target="_blank" rel="noopener noreferrer" class="">Stars</a>&nbsp;increased from 605 to 964, all&nbsp;<a href="https://oras.devstats.cncf.io/d/3/stars-and-forks-by-repository?orgId=1&amp;from=now-1y&amp;to=now" target="_blank" rel="noopener noreferrer" class="">Forks</a>&nbsp;increased from 123 to 220 in the past year</li>
<li class="">The total downloads of ORAS CLI are&nbsp;600,368</li>
<li class=""><a href="https://oras.devstats.cncf.io/d/15/new-prs-in-repository-groups?orgId=1" target="_blank" rel="noopener noreferrer" class="">The number of new PRs has tripled in the last year</a></li>
<li class="">Organized 17 public community meetings in 2022, see&nbsp;<a href="https://hackmd.io/P-O6n222TcSMoJgHmTTduw?view" target="_blank" rel="noopener noreferrer" class="">meeting notes</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adoption-powering-multiple-industries-and-oss-communities">Adoption: Powering multiple industries and OSS communities<a href="https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023#adoption-powering-multiple-industries-and-oss-communities" class="hash-link" aria-label="Direct link to Adoption: Powering multiple industries and OSS communities" title="Direct link to Adoption: Powering multiple industries and OSS communities" translate="no">​</a></h2>
<p>ORAS CLI, ORAS Go, and Python SDK are designed to help users and developers manage&nbsp;<a href="https://github.com/opencontainers/distribution-spec" target="_blank" rel="noopener noreferrer" class="">OCI Distribution</a>&nbsp;based artifacts. ORAS empowers the secure supply chain by enabling users to leverage the existing services they already have across their development to production environments.</p>
<p>Currently, the biggest cloud providers like Microsoft Azure, AWS, and Google Cloud are using ORAS to manage OCI artifacts in registries. ORAS Go SDK has been integrated and adopted by some industry-leading vendors and popular open-source projects. Here is part of known adopters till now:</p>
<ul>
<li class=""><a href="https://aws.amazon.com/ecr/" target="_blank" rel="noopener noreferrer" class="">Amazon ECR</a></li>
<li class=""><a href="https://anywhere.eks.amazonaws.com/docs/workshops/packages/harbor/#set-up-trivy-image-scanner-in-an-air-gapped-environment" target="_blank" rel="noopener noreferrer" class="">Amazon EKS Anywhere</a></li>
<li class=""><a href="https://www.alibabacloud.com/help/en/alibaba-cloud-service-mesh/latest/use-oras-to-simplify-wasm-based-asm-instance-extension" target="_blank" rel="noopener noreferrer" class="">Alibaba Cloud Service Mesh</a></li>
<li class=""><a href="https://artifacthub.io/docs/topics/repositories/helm-charts/#oci-support" target="_blank" rel="noopener noreferrer" class="">Artifact Hub</a></li>
<li class=""><a href="https://www.docker.com/blog/announcing-docker-hub-oci-artifacts-support/" target="_blank" rel="noopener noreferrer" class="">Docker Hub</a></li>
<li class=""><a href="https://github.com/" target="_blank" rel="noopener noreferrer" class="">GitHub</a></li>
<li class=""><a href="https://cloud.google.com/anthos-config-management/docs/how-to/sync-oci-artifacts-from-artifact-registry#oras" target="_blank" rel="noopener noreferrer" class="">Google Cloud</a></li>
<li class=""><a href="https://v3.helm.sh/docs/topics/registries/" target="_blank" rel="noopener noreferrer" class="">Helm</a></li>
<li class=""><a href="https://sylabs.io/guides/3.1/user-guide/cli/singularity_push.html" target="_blank" rel="noopener noreferrer" class="">Singularity</a></li>
<li class=""><a href="https://azure.microsoft.com/en-us/products/container-registry/" target="_blank" rel="noopener noreferrer" class="">Microsoft Azure - ACR</a></li>
<li class=""><a href="https://github.com/notaryproject/notation" target="_blank" rel="noopener noreferrer" class="">Notary v2</a></li>
<li class=""><a href="https://github.com/vmware-tanzu/kubeapps" target="_blank" rel="noopener noreferrer" class="">KubeApps</a>&nbsp;by VMware Tanzu</li>
<li class=""><a href="https://tanzu.vmware.com/application-catalog" target="_blank" rel="noopener noreferrer" class="">VMware Application Catalog</a></li>
<li class=""><a href="https://universalreference.io/" target="_blank" rel="noopener noreferrer" class="">Emporous (Formerly UOR Framework)</a>&nbsp;by Red Hat</li>
<li class=""><a href="https://github.com/awslabs/soci-snapshotter" target="_blank" rel="noopener noreferrer" class="">soci-snapshotter</a>&nbsp;by AWS</li>
<li class=""><a href="https://github.com/project-zot/zot" target="_blank" rel="noopener noreferrer" class="">Zot</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contributions-to-upstream-oci">Contributions to upstream OCI<a href="https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023#contributions-to-upstream-oci" class="hash-link" aria-label="Direct link to Contributions to upstream OCI" title="Direct link to Contributions to upstream OCI" translate="no">​</a></h2>
<p>Just a few years ago, there were no standards nor tooling for registries to natively store, discover, and pull a graph of OCI artifacts. To extend the registry’s role and form the industry standard, ORAS maintainers proposed a new artifact manifest type to describe and query relationships between objects stored in a registry, without mutating the existing content.</p>
<p>Initially, the reference types work was incubated under the CNCF <a href="https://github.com/oras-project/artifacts-spec" target="_blank" rel="noopener noreferrer" class="">ORAS Artifact manifest</a> project. It has been contributed to the OCI <a href="https://github.com/opencontainers/image-spec/blob/main/artifact.md" target="_blank" rel="noopener noreferrer" class="">Image</a> and <a href="https://github.com/opencontainers/distribution-spec" target="_blank" rel="noopener noreferrer" class="">Distribution</a> v1.1-RC specifications in Sep 2022. Now it is an industry standard and there are already a few early implementations, such as <a href="https://azure.microsoft.com/en-us/products/container-registry" target="_blank" rel="noopener noreferrer" class="">Azure Container Registry</a> and <a href="https://zotregistry.io/" target="_blank" rel="noopener noreferrer" class="">Zot registry</a>. After the OCI v1.1 specification is available, we expect more registry vendors start to support and implement it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="diverse-evangelism-and-advocacy">Diverse evangelism and advocacy<a href="https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023#diverse-evangelism-and-advocacy" class="hash-link" aria-label="Direct link to Diverse evangelism and advocacy" title="Direct link to Diverse evangelism and advocacy" translate="no">​</a></h2>
<p>Open-source contributions are not limited to coding. The non-code contributions like blogging, writing documentation, and technical sharing are also important for the ORAS community. It’s so good to see more and more users and contributors from different organizations sharing their use cases and best practices with ORAS toolings via blog posts or conference presentations this year. You can learn more about their experience from their articles and videos below.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="blogs">Blogs<a href="https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023#blogs" class="hash-link" aria-label="Direct link to Blogs" title="Direct link to Blogs" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://notaryproject.dev/blog/2022/oras-oci-artifacts-notation-signatures/" target="_blank" rel="noopener noreferrer" class="">Notation signatures as ORAS and OCI artifacts</a> by&nbsp;<a href="https://github.com/maxgio92" target="_blank" rel="noopener noreferrer" class="">maxgio92</a> from Clastix</li>
<li class=""><a href="https://www.docker.com/blog/announcing-docker-hub-oci-artifacts-support/" target="_blank" rel="noopener noreferrer" class="">Announcing Docker Hub OCI Artifacts Support</a> by <a href="https://www.docker.com/author/milos-gajdos/" target="_blank" rel="noopener noreferrer" class="">MILOS GAJDOS</a> from Docker</li>
<li class=""><a href="https://oras.land/blog/oras-0.14-and-future/" target="_blank" rel="noopener noreferrer" class="">ORAS 0.14 and Future: Empower Container Secure Supply Chain</a> by Feynman Zhou from Microsoft</li>
<li class=""><a href="https://oras.land/blog/oras-0.15-a-fully-functional-registry-client/" target="_blank" rel="noopener noreferrer" class="">ORAS 0.15: A Fully Functional OCI Registry Client</a> by Feynman Zhou and Yi Zha from Microsoft</li>
<li class=""><a href="https://cloud.google.com/blog/products/containers-kubernetes/gitops-with-oci-artifacts-and-config-sync" target="_blank" rel="noopener noreferrer" class="">Deploy OCI artifacts and Helm charts the GitOps way with Config Sync</a> from Google Cloud blogs</li>
<li class=""><a href="https://blogs.sap.com/2022/07/26/storing-abap-build-artifacts-in-oci-registry/" target="_blank" rel="noopener noreferrer" class="">Storing ABAP build artifacts in OCI registry</a> by <a href="https://people.sap.com/lars.hvam" target="_blank" rel="noopener noreferrer" class="">Lars Hvam</a> from the SAP community blog</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="presentations-at-conferences">Presentations at conferences<a href="https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023#presentations-at-conferences" class="hash-link" aria-label="Direct link to Presentations at conferences" title="Direct link to Presentations at conferences" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://youtu.be/lT2ZMRJrQsU" target="_blank" rel="noopener noreferrer" class="">Distributing Supply Chain Artifacts with OCI &amp; ORAS Artifacts</a> at KubeCon EU by Steve Lasker from Microsoft</li>
<li class=""><a href="https://youtu.be/VZckJNkJ0nQ" target="_blank" rel="noopener noreferrer" class="">It’s Complicated: Relationships Between Objects In OCI Registries</a> by Josh Dolitsky &amp; Sajay Antony</li>
<li class=""><a href="https://youtu.be/7RvFj_RWE7c" target="_blank" rel="noopener noreferrer" class="">Secure Container Supply Chain with Notation, ORAS, and Ratify</a> by Feynman Zhou from Microsoft</li>
<li class=""><a href="https://youtu.be/08ARHTeiXmo" target="_blank" rel="noopener noreferrer" class="">Build and Deploy Cloud Native (OCI) Artifacts, the GitOps Way</a> by Mathieu Benoit from Google</li>
<li class=""><a href="https://www.youtube.com/watch?v=6fohG10y3z0&amp;t=2002s" target="_blank" rel="noopener noreferrer" class="">Unleashing the Power of the Container Registry</a> at DevConf.us by Andrew Block &amp; Alex Flom</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-forward-whats-next-in-2023">Looking forward: what’s next in 2023<a href="https://oras.land/blog/oras-looking-back-at-2022-and-forward-to-2023#looking-forward-whats-next-in-2023" class="hash-link" aria-label="Direct link to Looking forward: what’s next in 2023" title="Direct link to Looking forward: what’s next in 2023" translate="no">​</a></h2>
<p>Looking forward to 2023, several exciting plans have already been identified:</p>
<ul>
<li class="">A stable release for ORAS CLI v1.0.0 and Go library v2.0.0, which are planned on Feb, 2023</li>
<li class="">A new website that brings developer-friendly layout design, demos, and documentation</li>
<li class="">Apply to become a CNCF Incubating project</li>
</ul>
<p>Last but not least, special thanks go to the many outstanding contributors, community evangelists, adopters.  We are also grateful to those who have incorporated ORAS in production and have been providing feedback to ensure ORAS is continuously improving. Let’s collaborate more on future milestones in 2023.</p>]]></content:encoded>
            <category>oras</category>
            <category>artifact</category>
        </item>
        <item>
            <title><![CDATA[ORAS 0.14 and Future - Empower Container Secure Supply Chain]]></title>
            <link>https://oras.land/blog/oras-0.14-and-future</link>
            <guid>https://oras.land/blog/oras-0.14-and-future</guid>
            <pubDate>Tue, 27 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[The OCI Registry As Storage (ORAS) project maintainers announced v0.14 release for the ORAS CLI recently. ORAS v0.14 introduces four new top-level commands and new options to manage supply chain artifacts across different container registries and multi-cloud environments.]]></description>
            <content:encoded><![CDATA[<p>The <a href="https://oras.land/" target="_blank" rel="noopener noreferrer" class="">OCI Registry As Storage (ORAS)</a> project maintainers announced v0.14 release for the ORAS CLI recently. ORAS v0.14 introduces four new top-level commands and new options to manage supply chain artifacts across different container registries and multi-cloud environments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-oras-014">What's new in ORAS 0.14<a href="https://oras.land/blog/oras-0.14-and-future#whats-new-in-oras-014" class="hash-link" aria-label="Direct link to What's new in ORAS 0.14" title="Direct link to What's new in ORAS 0.14" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt=" What&amp;#39;s new in ORAS 0.14" src="https://oras.land/assets/images/what's-new-0.14-5575fae8a08ecf3c857849a0d327bc5c.png" width="1750" height="896" class="img_ev3q"></p>
<p>Please see the <a href="https://github.com/oras-project/oras/releases/tag/v0.14.0" target="_blank" rel="noopener noreferrer" class="">Release Notes</a> for details.</p>
<p>Prior to ORAS CLI v0.14 release, the ORAS Go library, also released v2.0.0-rc.2 to support <a href="https://github.com/oras-project/artifacts-spec/releases/tag/v1.0.0-rc.2" target="_blank" rel="noopener noreferrer" class="">artifacts-spec v1.0.0-rc.2</a> and provides new functions to enable developers to build your own OCI client tool.</p>
<p>As cloud native development continues to grow, we have seen increased community interest in evolving registries to natively store, pull, copy, and discover a graph of supply chain artifacts. Artifact references are important for many use cases such as adding Software Bill of Materials (SBOM), security scan results, and container image signatures.</p>
<p>This blog will demonstrate how to use ORAS CLI v0.14 to copy an image from a public registry validated by Microsoft to a private registry, then attach an SBOM to it and discover the reference in a tree graph.</p>
<p><img decoding="async" loading="lazy" alt="ORAS workflow" src="https://oras.land/assets/images/oras-workflow-1359e21382e363b9fad0c55e7eb36f9f.png" width="2619" height="513" class="img_ev3q"></p>
<blockquote>
<p>Note: we will use MAR (Microsoft Artifact Registry) and ACR (Azure Container Registry) for demonstration purpose only. There will be another <a href="https://github.com/oras-project/oras-www/issues/54" target="_blank" rel="noopener noreferrer" class="">blog posts</a> to demonstrate how to use ORAS with Amazon ECR and Google GAR soon.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-oras-014">Install ORAS 0.14<a href="https://oras.land/blog/oras-0.14-and-future#install-oras-014" class="hash-link" aria-label="Direct link to Install ORAS 0.14" title="Direct link to Install ORAS 0.14" translate="no">​</a></h2>
<p>Install the latest release of ORAS on a Linux environment:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">curl -LO https://github.com/oras-project/oras/releases/download/v0.14.1/oras_0.14.1_linux_amd64.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir -p oras-install/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tar -zxf oras_0.14.1_*.tar.gz -C oras-install/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mv oras-install/oras /usr/local/bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rm -rf oras_0.14.1_*.tar.gz oras-install/</span><br></div></code></pre></div></div>
<blockquote>
<p>Note: You can also refer to the <a href="https://oras.land/cli/" target="_blank" rel="noopener noreferrer" class="">installation guide</a> for other different platforms.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="copy-an-image-from-registry-a-to-registry-b">Copy an image from Registry A to Registry B<a href="https://oras.land/blog/oras-0.14-and-future#copy-an-image-from-registry-a-to-registry-b" class="hash-link" aria-label="Direct link to Copy an image from Registry A to Registry B" title="Direct link to Copy an image from Registry A to Registry B" translate="no">​</a></h2>
<p>In this demo, we'll use ORAS to copy the container image from the public MAR registry to my private ACR registry. You can use your preferred container registry with ORAS.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">oras copy mcr.microsoft.com/mmlspark/spark2.4:1.0.0 feynmanacr.azurecr.io/mmlspark/spark2.4:1.0.0</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-sbom-tool-to-generate-a-sbom">Using SBOM Tool to generate a SBOM<a href="https://oras.land/blog/oras-0.14-and-future#using-sbom-tool-to-generate-a-sbom" class="hash-link" aria-label="Direct link to Using SBOM Tool to generate a SBOM" title="Direct link to Using SBOM Tool to generate a SBOM" translate="no">​</a></h2>
<p>An SBOM creates a machine-readable inventory of the software components that make up a given software product. Generating SBOM is a first step in Supply Chain Security.</p>
<p>You can use <a href="https://docs.docker.com/engine/sbom/" target="_blank" rel="noopener noreferrer" class="">Docker SBOM</a> or <a href="https://github.com/microsoft/sbom-tool" target="_blank" rel="noopener noreferrer" class="">SBOM Tool</a> to generate a SBOM for the target image.</p>
<p>SBOM Tool can be used to create SPDX 2.2 compatible SBOMs for any variety of artifacts. In this demo, we use SBOM Tool to create SPDX 2.2 compatible SBOM for the sample Spark image.</p>
<p>Install the SBOM Tool within a Linux environment:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">curl -Lo sbom-tool https://github.com/microsoft/sbom-tool/releases/latest/download/sbom-tool-linux-x64</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">chmod +x sbom-tool</span><br></div></code></pre></div></div>
<p>Generate a SBOM for the Spark image stored in ACR:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sbom-tool generate -di feynmanacr.azurecr.io/mmlspark/spark2.4:1.0.0 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -b ./foo \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -pn bar \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -pv 0.1 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -bc ./foo \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -ps MyCompany \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -nsb http://mycompany.com</span><br></div></code></pre></div></div>
<p>Then it will create a SBOM <code>manifest.spdx.json</code> in <code>foo/_manifest/spdx_2.2</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="attach-the-sbom-to-this-image">Attach the SBOM to this image<a href="https://oras.land/blog/oras-0.14-and-future#attach-the-sbom-to-this-image" class="hash-link" aria-label="Direct link to Attach the SBOM to this image" title="Direct link to Attach the SBOM to this image" translate="no">​</a></h2>
<p>Next, let's attach the generate SBOM to this Spark image stored in ACR:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ oras attach feynmanacr.azurecr.io/mmlspark/spark2.4:1.0.0 foo/_manifest/spdx_2.2/manifest.spdx.json --artifact-type example/sbom</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Uploading 97a5dc071dd1 manifest.spdx.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Uploaded  97a5dc071dd1 manifest.spdx.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Attached to feynmanacr.azurecr.io/mmlspark/spark2.4:1.0.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Digest: sha256:7592c8026675e463e7ced9b7ed369c2962b354a69b842423e8ctestdigest</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="view-the-graph-of-artifacts">View the graph of artifacts<a href="https://oras.land/blog/oras-0.14-and-future#view-the-graph-of-artifacts" class="hash-link" aria-label="Direct link to View the graph of artifacts" title="Direct link to View the graph of artifacts" translate="no">​</a></h2>
<p>A linked graph of supply chain artifacts can be viewed through the ORAS discovery command:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ oras discover feynmanacr.azurecr.io/mmlspark/spark2.4:1.0.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Discovered 1 artifacts referencing feynmanacr.azurecr.io/mmlspark/spark2.4:1.0.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Digest: sha256:28de427f1df8cdb99bc98536b489d75cc496a2d37c3b9266248etestdigest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Artifact Type   Digest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">example/sbom    sha256:7592c8026675e463e7ced9b7ed369c2962b354a69b842423e8ctestdigest</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="oras-present-and-future">ORAS Present and Future<a href="https://oras.land/blog/oras-0.14-and-future#oras-present-and-future" class="hash-link" aria-label="Direct link to ORAS Present and Future" title="Direct link to ORAS Present and Future" translate="no">​</a></h2>
<p>ORAS has been integrated and adopted by some industry-leading ISVs and projects, such as <a href="https://github.com/awslabs/soci-snapshotter" target="_blank" rel="noopener noreferrer" class="">soci-snapshotter</a> by AWS, <a href="https://github.com/vmware-tanzu/kubeapps" target="_blank" rel="noopener noreferrer" class="">KubeApps</a> by VMware Tanzu, <a href="https://universalreference.io/" target="_blank" rel="noopener noreferrer" class="">UOR Framework</a> by Red Hat etc.</p>
<p>ORAS 0.15 and future milestones will provide more capabilities to easily manage OCI content and interact with registries. It will empower the container secure supply chain and focus on the following areas:</p>
<ul>
<li class="">Be able to manage repository, tag, manifest, and blob</li>
<li class="">Support and migrate to OCI reference types</li>
<li class="">Support push/pull artifacts from OCI Image Layout</li>
<li class="">E2E testing</li>
</ul>
<p>See the ORAS <a href="https://github.com/oras-project/community/blob/main/Roadmap.md" target="_blank" rel="noopener noreferrer" class="">Roadmap</a> for more details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-the-oras-community">Join the ORAS community<a href="https://oras.land/blog/oras-0.14-and-future#join-the-oras-community" class="hash-link" aria-label="Direct link to Join the ORAS community" title="Direct link to Join the ORAS community" translate="no">​</a></h2>
<p>The ORAS Project was accepted in June 2021 as a Cloud Native Computing Foundation (CNCF) Sandbox project. It is important that we hear from the community as we advance the artifact-spec capability; if you maintain or are implementing a container registry, we are particularly interested in your feedback. Working together, we can improve supply chain artifact security in the cloud native ecosystem.</p>
<ul>
<li class="">
<p><a href="https://x.com/intent/follow?screen_name=orasproject" target="_blank" rel="noopener noreferrer" class="">Follow ORAS on X</a></p>
</li>
<li class="">
<p><a href="https://slack.cncf.io/" target="_blank" rel="noopener noreferrer" class="">Join the Slack channel in CNCF</a> and find us at <strong>oras</strong> channel</p>
</li>
</ul>]]></content:encoded>
            <category>oras</category>
            <category>artifact</category>
        </item>
        <item>
            <title><![CDATA[ORAS Artifacts Draft Specification Release – Adding Secure Supply Chain Artifacts References]]></title>
            <link>https://oras.land/blog/oras-artifacts-draft-specification-release</link>
            <guid>https://oras.land/blog/oras-artifacts-draft-specification-release</guid>
            <pubDate>Wed, 15 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, the OCI Registry As Storage (ORAS) project maintainers are happy to announce the first draft release of artifacts-spec. The artifacts-spec defines how OCI distribution-based registry users can attach references to images, helm charts, and other OCI Artifacts.]]></description>
            <content:encoded><![CDATA[<p>Today, the <a href="https://oras.land/" target="_blank" rel="noopener noreferrer" class="">OCI Registry As Storage (ORAS)</a> project maintainers are happy to announce the first draft release of <a href="https://github.com/oras-project/artifacts-spec/releases/tag/1.0.0-draft.1" target="_blank" rel="noopener noreferrer" class="">artifacts-spec</a>. The artifacts-spec defines how OCI distribution-based registry users can attach references to images, helm charts, and other <a href="https://github.com/opencontainers/artifacts" target="_blank" rel="noopener noreferrer" class="">OCI Artifacts</a>.</p>
<p><img decoding="async" loading="lazy" alt="Net Monitor Graph" src="https://oras.land/assets/images/net-monitor-graph-0362e24ff69d14ea54eadd78ce5608fd.png" width="381" height="459" class="img_ev3q"></p>
<p>As cloud native development continues to grow, we have seen increased community interest in evolving registries to natively store, discover, and pull a graph of supply chain artifacts. Artifact references are important for many use cases such as adding Software Bill of Materials (SBOM), security scan results, and container image signing. With the release of the artifacts specification, end-user tooling can now implement discovery that makes it feasible to determine if there are any references attached to a container image, answering the key question: “What SBOMs or signatures are associated with this container image?”</p>
<p>The ORAS Project was accepted in June 2021 as a Cloud Native Computing Foundation (CNCF) Sandbox project. It is important that we hear from the community as we advance the artifact-spec capability; if you maintain or are implementing a container registry, we are particularly <a href="https://github.com/oras-project/artifacts-spec#community" target="_blank" rel="noopener noreferrer" class="">interested in your feedback</a>. Working together, we can improve supply chain artifact security in the cloud native ecosystem.</p>]]></content:encoded>
            <category>oras</category>
            <category>artifact</category>
        </item>
    </channel>
</rss>