Compute deploy: managed pool enters error state (Failed to start container / PORT) although containers boot and listen on 0.0.0.0:3000
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 6.2k
- Forks
- 252
- Avg merge
- 2d 8h
- Merged PRs (30d)
- 96
Description
Summary
@rivetkit/cli deploy consistently fails with managed pool entered error state: Failed to start container: Ensure your container starts successfully on the PORT environment variable. Make sure your image was built for linux/amd64. — while the namespace logs show the exact same containers booting cleanly, binding 0.0.0.0:3000, and logging nothing but the RivetKit banner. Reproduces on every deploy attempt, across two namespaces and two separate apps/sessions.
Environment
- RivetKit
2.3.14(npm), runtime banner reports2.3.10 - CLI:
rivet 2.3.14(npx @rivetkit/cli deploy) - Docker Desktop 29.8.0 / buildx (macOS, arm64 host — CLI builds with
--platform linux/amd64) - Runtime mode: serverless (Compute-injected; app uses plain
registry.start(), no custom HTTP router) - Image:
node:24-slim,CMD ["node", "dist/server.js"],EXPOSE 3000, deps externalized - App: registry with one
agentOSactor (vm)
Steps to reproduce
npx @rivetkit/cli deploy --token <cloud_api_*> --namespace beta-7g2s-production-d1j5 --env PORT=3000 --yes
# also tried: --env PORT=3000 --env RIVET_PORT=3000
Token authenticates, namespace is created/upserted, image builds (docker buildx build --platform linux/amd64) and pushes to registry.rivet.dev/beta-g2ly:fca85e1 (digest sha256:0cb154e8…, second push sha256:0aec6ba5…). Pool then cycles deploying → … → error with the message above.
Actual result
INFO pool status status=deploying (x20)
INFO pool status status=error
Error: managed pool entered error state: Failed to start container: Ensure your container starts successfully on the PORT environment variable. Make sure your image was built for linux/amd64.
rivet logs immediately after (timestamps UTC) shows healthy boots from four regions:
2026-09-10T07:34:41.050Z [DEFAULT] us-west-1 RivetKit 2.3.10 (Engine - Serverless)
2026-09-10T07:34:43.702Z [DEFAULT] ap-southeast-1 - Listening: http://0.0.0.0:3000
2026-09-10T07:34:43.895Z [DEFAULT] eu-central-1 - Actors: 1
2026-09-10T07:34:44.387Z [DEFAULT] us-east-1 - Public Dir: /public
No error/warn/crash lines after the banners — the containers stay up and listen.
What we already ruled out
- Port mismatch —
PORT=3000(andPORT+RIVET_PORT=3000variants); container logs confirm the app binds0.0.0.0:3000. - Architecture — the CLI itself builds
--platform linux/amd64; no arm64 layers in the manifest list. - Image defect — the identical image runs locally:
docker run -e RIVETKIT_RUNTIME_MODE=serverless -p 3999:3000 …→GET /api/rivet/health→200 {"runtime":"rivetkit","status":"ok","version":"2.3.10"}. - App crash — namespace logs contain only clean boot banners across us-west-1 / ap-southeast-1 / eu-central-1 / us-east-1.
- Auth / namespace state — deploys authenticate, push, and upsert the pool fine.
Cross-check
A second app, deployed to a second namespace (beta-g2ly-production-kxh0) from an independent session, hits the identical error string — while its logs also show successful boots. Both namespaces currently 404 on their <ns>.rivet.run/api/rivet/health (no route), consistent with the pool start-check failing so no route is registered.
Ask
Looks like the managed-pool container start-check (health/registration probe) is rejecting containers that are actually up — possibly a probe-target/registration race or a probe-port regression in the runner. Happy to share namespace details privately or run any diagnostics you point me at.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Run the reported @rivetkit/cli deploy command and inspect rivet logs alongside the managed-pool status transition. Compare the start-check or registration probe with the logs showing 0.0.0.0:3000 and the /api/rivet/health request; done means a healthy container reaches a ready pool state and the namespace health route returns 200.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- docker, node.js
- Domain
- cloud, infrastructure
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 50/100