Containers can now exec() processes with stdin, stdout, and exit codes
exec() is now available for Containers. Use this.ctx.container.exec() to start processes inside a running Container, stream standard input and output, inspect exit codes, and signal each process.
Call exec() from a class extending Container, or from another Durable Object through this.ctx.container. The associated Container must already be running.
This example starts the Container when needed, then reads its Node.js version:
-
JavaScript
<div><div><span>import </span><span>{</span><span><span> </span><span>Container</span><span> </span></span><span>}</span><span> from </span><span>"@cloudflare/containers"</span><span>;</span></div></div><div><div> </div></div><div><div><span>export</span><span> </span><span>class</span><span> </span><span>MyContainer</span><span> </span><span>extends</span><span> </span><span>Container</span><span> </span><span>{</span></div></div><div><div><span> </span><span>async</span><span> </span><span>readVersion</span><span>()</span><span> </span><span>{</span></div></div><div><div><span> </span><span>if</span><span> (</span><span>!</span><span>this</span><span>.</span><span>ctx</span><span>.</span><span>container</span><span>.</span><span>running</span><span>) </span><span>{</span></div></div><div><div><span> </span><span>await</span><span> </span><span>this</span><span>.</span><span>start</span><span>()</span><span>;</span></div></div><div><div><span> </span><span>}</span></div></div><div><div> </div></div><div><div><span> </span><span>const</span><span> </span><span>process</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>this</span><span>.</span><span>ctx</span><span>.</span><span>container</span><span>.</span><span>exec</span><span>([</span><span>"node"</span><span>,</span><span> </span><span>"--version"</span><span>])</span><span>;</span></div></div><div><div><span> </span><span>const</span><span> </span><span>output</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>process</span><span>.</span><span>output</span><span>()</span><span>;</span></div></div><div><div><span> </span><span>const</span><span> </span><span>decoder</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>TextDecoder</span><span>()</span><span>;</span></div></div><div><div> </div></div><div><div><span> </span><span>return</span><span> </span><span>{</span></div></div><div><div><span><span> </span></span><span>exitCode</span><span>:</span><span> </span><span>output</span><span>.</span><span>exitCode</span><span>,</span></div></div><div><div><span><span> </span></span><span>stdout</span><span>:</span><span> </span><span>decoder</span><span>.</span><span>decode</span><span>(</span><span>output</span><span>.</span><span>stdout</span><span>)</span><span>,</span></div></div><div><div><span><span> </span></span><span>stderr</span><span>:</span><span> </span><span>decoder</span><span>.</span><span>decode</span><span>(</span><span>output</span><span>.</span><span>stderr</span><span>)</span><span>,</span></div></div><div><div><span> </span><span>};</span></div></div><div><div><span> </span><span>}</span></div></div><div><div><span>}</span></div></div> -
TypeScript
<div><div><span>import </span><span>{</span><span><span> </span><span>Container</span><span> </span></span><span>}</span><span> from </span><span>"@cloudflare/containers"</span><span>;</span></div></div><div><div> </div></div><div><div><span>export</span><span> </span><span>class</span><span> </span><span>MyContainer</span><span> </span><span>extends</span><span> </span><span>Container</span><span> </span><span>{</span></div></div><div><div><span> </span><span>async</span><span> </span><span>readVersion</span><span>()</span><span> </span><span>{</span></div></div><div><div><span> </span><span>if</span><span> (</span><span>!</span><span>this</span><span>.</span><span>ctx</span><span>.</span><span>container</span><span>.</span><span>running</span><span>) </span><span>{</span></div></div><div><div><span> </span><span>await</span><span> </span><span>this</span><span>.</span><span>start</span><span>()</span><span>;</span></div></div><div><div><span> </span><span>}</span></div></div><div><div> </div></div><div><div><span> </span><span>const</span><span> </span><span>process</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>this</span><span>.</span><span>ctx</span><span>.</span><span>container</span><span>.</span><span>exec</span><span>([</span><span>"node"</span><span>,</span><span> </span><span>"--version"</span><span>])</span><span>;</span></div></div><div><div><span> </span><span>const</span><span> </span><span>output</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>process</span><span>.</span><span>output</span><span>()</span><span>;</span></div></div><div><div><span> </span><span>const</span><span> </span><span>decoder</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>TextDecoder</span><span>()</span><span>;</span></div></div><div><div> </div></div><div><div><span> </span><span>return</span><span> </span><span>{</span></div></div><div><div><span><span> </span></span><span>exitCode</span><span>:</span><span> </span><span>output</span><span>.</span><span>exitCode</span><span>,</span></div></div><div><div><span><span> </span></span><span>stdout</span><span>:</span><span> </span><span>decoder</span><span>.</span><span>decode</span><span>(</span><span>output</span><span>.</span><span>stdout</span><span>)</span><span>,</span></div></div><div><div><span><span> </span></span><span>stderr</span><span>:</span><span> </span><span>decoder</span><span>.</span><span>decode</span><span>(</span><span>output</span><span>.</span><span>stderr</span><span>)</span><span>,</span></div></div><div><div><span> </span><span>};</span></div></div><div><div><span> </span><span>}</span></div></div><div><div><span>}</span></div></div>
The command array starts an executable directly, without an implicit shell. Invoke a shell explicitly for pipes, redirects, or variable expansion.
One RPC method can coordinate multiple exec() calls in one caller-to-Durable Object round trip. It can also pass byte-oriented ReadableStream input or return streamed output with flow control.
For options and streaming examples, refer to Execute commands.
Fetched June 27, 2026


