## Wrangler Configuration ### Basic Container Config ```jsonc { "name": "my-worker", "main": "src/index.ts", "compatibility_date": "2026-01-10", "containers": [ { "class_name": "MyContainer", "image": "./Dockerfile", // Path to Dockerfile or directory with Dockerfile "instance_type": "standard-1", // Predefined or custom (see below) "max_instances": 10 } ], "durable_objects": { "bindings": [ { "name": "MY_CONTAINER", "class_name": "MyContainer" } ] }, "migrations": [ { "tag": "v1", "new_sqlite_classes": ["MyContainer"] // Must use new_sqlite_classes } ] } ``` Key config requirements: - `image` - Path to Dockerfile or directory containing Dockerfile - `class_name` - Must match Container class export name - `max_instances` - Max concurrent container instances - Must configure Durable Objects binding AND migrations ### Instance Types #### Predefined Types | Type | vCPU | Memory | Disk | |------|------|--------|------| | lite | 1/16 | 256 MiB | 2 GB | | basic | 1/4 | 1 GiB | 4 GB | | standard-1 | 1/2 | 4 GiB | 8 GB | | standard-2 | 1 | 6 GiB | 12 GB | | standard-3 | 2 | 8 GiB | 16 GB | | standard-4 | 4 | 12 GiB | 20 GB | ```jsonc { "containers": [ { "class_name": "MyContainer", "image": "./Dockerfile", "instance_type": "standard-2" // Use predefined type } ] } ``` #### Custom Types (Jan 2026 Feature) ```jsonc { "containers": [ { "class_name": "MyContainer", "image": "./Dockerfile", "instance_type_custom": { "vcpu": 2, // 1-4 vCPU "memory_mib": 8192, // 512-12288 MiB (up to 12 GiB) "disk_mib": 16384 // 2048-20480 MiB (up to 20 GB) } } ] } ``` **Custom type constraints:** - Minimum 3 GiB memory per vCPU - Maximum 2 GB disk per 1 GiB memory - Max 4 vCPU, 12 GiB memory, 20 GB disk per container ### Account Limits | Resource | Limit | Notes | |----------|-------|-------| | Total memory (all containers) | 400 GiB | Across all running containers | | Total vCPU (all containers) | 100 | Across all running containers | | Total disk (all containers) | 2 TB | Across all running containers | | Image storage per account | 50 GB | Stored container images | ### Container Class Properties ```typescript import { Container } from "@cloudflare/containers"; export class MyContainer extends Container { // Port Configuration defaultPort = 8080; // Default port for fetch() calls requiredPorts = [8080, 9090]; // Ports to wait for in startAndWaitForPorts() // Lifecycle sleepAfter = "30m"; // Inactivity timeout (5m, 30m, 2h, etc.) // Network enableInternet = true; // Allow outbound internet access // Health Check pingEndpoint = "/health"; // Health check endpoint path // Environment envVars = { // Environment variables passed to container NODE_ENV: "production", LOG_LEVEL: "info" }; // Startup entrypoint = ["/bin/start.sh"]; // Override image entrypoint (optional) } ``` **Property details:** - **`defaultPort`**: Port used when calling `container.fetch()` without explicit port. Falls back to port 33 if not set. - **`requiredPorts`**: Array of ports that must be listening before `startAndWaitForPorts()` returns. First port becomes default if `defaultPort` not set. - **`sleepAfter`**: Duration string (e.g., "5m", "30m", "2h"). Container stops after this period of inactivity. Timer resets on each request. - **`enableInternet`**: Boolean. If `true`, container can make outbound HTTP/TCP requests. - **`pingEndpoint`**: Path used for health checks. Should respond with 2xx status. - **`envVars`**: Object of environment variables. Merged with runtime-provided vars (see below). - **`entrypoint`**: Array of strings. Overrides container image's CMD/ENTRYPOINT. ### Runtime Environment Variables Cloudflare automatically provides these environment variables to containers: | Variable | Description | |----------|-------------| | `CLOUDFLARE_APPLICATION_ID` | Worker application ID | | `CLOUDFLARE_COUNTRY_A2` | Two-letter country code of request origin | | `CLOUDFLARE_LOCATION` | Cloudflare data center location | | `CLOUDFLARE_REGION` | Region identifier | | `CLOUDFLARE_DURABLE_OBJECT_ID` | Container's Durable Object ID | Custom `envVars` from Container class are merged with these. Custom vars override runtime vars if names conflict. ### Image Management **Distribution model:** Images pre-fetched to all global locations before deployment. Ensures fast cold starts (2-3s typical). **Rolling deploys:** Unlike Workers (instant), container deployments roll out gradually. Old versions continue running during rollout. **Ephemeral disk:** Container disk is ephemeral and resets on each stop. Use Durable Object storage (`this.ctx.storage`) for persistence. ## wrangler.toml Format ```toml name = "my-worker" main = "src/index.ts" compatibility_date = "2026-01-10" [[containers]] class_name = "MyContainer" image = "./Dockerfile" instance_type = "standard-2" max_instances = 10 [[durable_objects.bindings]] name = "MY_CONTAINER" class_name = "MyContainer" [[migrations]] tag = "v1" new_sqlite_classes = ["MyContainer"] ``` Both `wrangler.jsonc` and `wrangler.toml` are supported. Use `wrangler.jsonc` for comments and better IDE support.