[ PROMPT_NODE_24040 ]
Containers 常见陷阱
[ SKILL_DOCUMENTATION ]
## 关键陷阱
### ⚠️ WebSocket:fetch() vs containerFetch()
**问题:** WebSocket 连接静默失败
**原因:** `containerFetch()` 不支持 WebSocket 升级
**修复:** WebSocket 请始终使用 `fetch()`
typescript
// ❌ 错误
return container.containerFetch(request);
// ✅ 正确
return container.fetch(request);
### ⚠️ startAndWaitForPorts() vs start()
**问题:** `start()` 后出现“连接被拒绝”
**原因:** `start()` 在进程启动时返回,而不是在端口就绪时
**修复:** 请求前使用 `startAndWaitForPorts()`
typescript
// ❌ 错误
await container.start();
return container.fetch(request);
// ✅ 正确
await container.startAndWaitForPorts();
return container.fetch(request);
### ⚠️ 长时间操作的活动超时
**问题:** 容器在长时间工作期间停止
**原因:** `sleepAfter` 基于请求活动,而非内部工作
**修复:** 通过触碰存储来更新超时
typescript
const interval = setInterval(() => {
this.ctx.storage.put("keepalive", Date.now());
}, 60000);
try {
await this.doLongWork(data);
} finally {
clearInterval(interval);
}
### ⚠️ 启动时的 blockConcurrencyWhile
**问题:** 初始化期间的竞态条件
**修复:** 使用 `blockConcurrencyWhile` 进行原子初始化
typescript
await this.ctx.blockConcurrencyWhile(async () => {
if (!this.initialized) {
await this.startAndWaitForPorts();
this.initialized = true;
}
});
### ⚠️ 生命周期钩子阻塞请求
**问题:** 容器在 `onStart()` 期间无响应
**原因:** 钩子在 `blockConcurrencyWhile` 中运行 - 无并发请求
**修复:** 保持钩子快速执行,避免长时间操作
### ⚠️ 使用 schedule() 时不要覆盖 alarm()
**问题:** 定时任务不执行
**原因:** `schedule()` 内部使用 `alarm()`
**修复:** 实现 `alarm()` 以处理定时任务
## 常见错误
### "Container start timeout"
**原因:** 容器启动耗时超过 8s (`start()`) 或 20s (`startAndWaitForPorts()`)
**解决方案:**
- 优化镜像(更小的基础镜像,更少的层)
- 检查 `entrypoint` 是否正确
- 验证应用是否监听了正确的端口
- 如有必要,增加超时时间
### "Port not available"
**原因:** 在端口就绪前调用 `fetch()`
**解决方案:** 使用 `startAndWaitForPorts()`
### "Container memory exceeded"
**原因:** 使用的内存超过了实例类型允许的范围
**解决方案:**
- 使用更大的实例类型 (standard-2, standard-3, standard-4)
- 优化应用内存使用