Skip to content

Migrate from the Container class to the Durable Object Container API

Last updated View as MarkdownAgent setup

The Durable Object Container API lets your Durable Object coordinate container compute with persistent storage, alarms, and request handling. Access it as this.ctx.container inside a Durable Object with a container binding. When migrating from the Container class, replace its helpers with application code where needed.

Before changing code, identify which helpers your application uses. Some helpers require application code to preserve their existing behavior. For an API comparison, refer to Choose an API.

You can migrate the implementation without replacing the Durable Object. Keep the Worker name, exported class name, binding, container image, and existing migration tags unchanged. Changing the TypeScript base class does not require a new Durable Object migration.

Replace Container class helpers

The Container class extends DurableObject. Replace its inherited lifecycle and routing helpers with application code that uses ctx.container.

  1. In your Worker, change the class to extend DurableObject from cloudflare:workers. Keep the exported class name to retain its existing container definition and Durable Object binding. Do not add a new Durable Object migration solely because you changed the base class. Refer to Wrangler configuration.
  2. Replace start() calls with ctx.container.start(). Replace stop() calls with signal() or destroy(), as appropriate. Do not assume start() waits for a port to become ready.
  3. Replace defaultPort, containerFetch(), and automatic fetch() routing with getTcpPort(port).fetch() and your own request routing. Check port readiness before forwarding requests.
  4. Replace sleepAfter with setInactivityTimeout(). Replace lifecycle hooks and schedule() with application code, monitor(), and Durable Object alarms where appropriate.
  5. Test startup, concurrent requests, readiness, idle shutdown, alarm delivery, storage continuity, and recovery after a container restart. A container can be temporarily unavailable after stop() or destroy(). Retry allocation before checking port readiness. Then remove @cloudflare/containers only if no other code imports it.

Keep the same image in the containers section of your Wrangler configuration unless you intend to change the container application itself. The direct API still runs the image associated with its Durable Object class.

For process handling and output, refer to Execute commands and the exec() reference.

Was this helpful?