releases.shpreview

Containers can now exec() processes with stdin, stdout, and exit codes

1 featureThis release1 featureNew capabilitiesAI-tallied from the release notes
From the original release noteView original ↗

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