Containers - Snapshot and restore Container filesystem
- Announced
- Tags
- Containers
- Severity
- info, set by
reef/rss-rule-v1 - Source
- https://developers.cloudflare.com/changelog/post/2026-09-30-snapshots/
<p><a href="https://developers.cloudflare.com/containers/">Containers</a> now support snapshot APIs in public beta for saving and restoring point-in-time filesystem state. Create a snapshot first, then pass it back to <code>start()</code> to restore files after container sleep, restart, or handoff to another Durable Object.</p> <p>Use <code>snapshotContainer()</code> through the <a href="https://developers.cloudflare.com/containers/api/durable-object-container/">Durable Object Container API</a> to capture the full container filesystem. Create a snapshot from a running Container, store its handle, and pass that handle to <code>start()</code> when you restore it later:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { DurableObject } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyDurableObject</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> saveSnapshot</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Create a snapshot from the running Container.</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> containerSnapshot</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.container.</span><span class="nb-shiki-1t8gfj">snapshotContainer</span><span class="nb-shiki-140thh">({});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.storage.</span><span class="nb-shiki-1t8gfj">put</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"containerSnapshot"</span><span class="nb-shiki-140thh">, containerSnapshot);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> restoreSnapshot</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Restore the saved snapshot later.</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> containerSnapshot</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.storage.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"containerSnapshot"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">containerSnapshot) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.container.</span><span class="nb-shiki-1t8gfj">start</span><span class="nb-shiki-140thh">({ containerSnapshot, enableInternet: </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { DurableObject } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyDurableObject</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> saveSnapshot</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Create a snapshot from the running Container.</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> containerSnapshot</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.container.</span><span class="nb-shiki-1t8gfj">snapshotContainer</span><span class="nb-shiki-140thh">({});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.storage.</span><span class="nb-shiki-1t8gfj">put</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"containerSnapshot"</span><span class="nb-shiki-140thh">, containerSnapshot);</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> restoreSnapshot</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // Restore the saved snapshot later.</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> containerSnapshot</span><span class="nb-shiki-1itgoe"> =</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.storage.</span><span class="nb-shiki-1t8gfj">get</span><span class="nb-shiki-140thh"><</span><span class="nb-shiki-1t8gfj">ContainerSnapshot</span><span class="nb-shiki-140thh">>(</span><span class="nb-shiki-mdbnqw">"containerSnapshot"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1itgoe">!</span><span class="nb-shiki-140thh">containerSnapshot) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh">;</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.ctx.container.</span><span class="nb-shiki-1t8gfj">start</span><span class="nb-shiki-140thh">({ containerSnapshot, enableInternet: </span><span class="nb-shiki-dzsirb">false</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>Snapshots are only supported for Container applications that use the <a href="https://developers.cloudflare.com/containers/configuration/scheduling-policy/#use-the-durable-object-scheduling-policy"><code>durable_object</code> scheduling policy</a>. Snapshots are immutable, so create a new snapshot to persist filesystem changes made after a restore.</p> <p>For more information, refer to <a href="https://developers.cloudflare.com/containers/guides/snapshots/">Snapshots</a> and the <a href="https://developers.cloudflare.com/containers/api/durable-object-container/">Durable Object Container API</a>.</p>
The text above is the source's. reef added the severity, the dates it could read from the text, and the endpoints and scopes named in code.