一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

daytona创建snapshot: 获取初始runner失败: 错误: 无可用runner

时间:2026-07-14 10:30:53 编辑:袖梨 来源:一聚教程网

错误日志分析

错误信息

{"level": 40, // WARN 级别(非致命错误)"context": "SnapshotManager","msg": "Failed to get initial runner: Error: No available runners"}

这条日志每 10 秒重复一次,来自 SnapshotManager 的定时同步任务。

daytona创建snapshot: Failed to get initial runner: Error: No available runners

根本原因

问题出在 availabilityScore 阈值不满足。

数据库中有一条 pending 状态的 snapshot 需要分配初始 runner:

snapshotnamestatesandboxClassinitialRunnerId
0e5a7b23...sandbox-extra:0.6pendingcontainer(空,未分配)

SnapshotManager 在 handleSnapshotStatePending() 中尝试为这条 snapshot 分配 runner,代码逻辑如下(snapshot.manager.ts:1210-1216):

const availabilityThreshold =this.configService.getOrThrow('runnerScore.thresholds.availability') +// 默认 10this.configService.getOrThrow('runnerScore.thresholds.initialRunnerScoreAddon')// 默认 20initialRunner = await this.runnerService.getRandomAvailableRunner({regions: ['us'],sandboxClass: 'container',availabilityScoreThreshold: availabilityThreshold,// = 10 + 20 = 30...})

而数据库中唯一的 runner:

namestateregionsandboxClassavailabilityScore
defaultreadyuscontainer5

findAvailableRunners() 中的过滤条件要求:

availabilityScore: MoreThanOrEqual(availabilityThreshold)// 要求 >= 30

runner 的 availabilityScore = 5,远低于阈值 30,所以被过滤掉,返回空数组,抛出 No available runners

原因总结

┌─────────────────────────────────────────────────────┐│Snapshot (pending) 需要初始 runner││要求: availabilityScore >= 30 ││(availability阈值10 + initialRunnerScoreAddon 20) ││ ││唯一 Runner: availabilityScore = 5❌ 不满足 ││ ││结果: "No available runners" → 每10秒重试 │└─────────────────────────────────────────────────────┘

availabilityScore 是一个动态计算的负载评分(基于 CPU/内存/磁盘使用率等),分数越低表示 runner 越空闲。但 initialRunnerScoreAddon 额外加了 20 分的门槛,目的是确保 snapshot 构建只分配到负载很低的 runner。

可能的解决方案

方案 1:降低阈值(推荐,适合开发环境)

在 docker-compose.yaml 中为 API 容器添加环境变量:

environment:- RUNNER_INITIAL_RUNNER_SCORE_ADDON=0# 取消额外门槛(默认20)# 或- RUNNER_AVAILABILITY_SCORE_THRESHOLD=0# 直接降低基础门槛

方案 2:手动更新 runner 的 availabilityScore

UPDATE runner SET "availabilityScore" = 100 WHERE name = 'default';

方案 3:删除卡住的 pending snapshot(如果不需要)

DELETE FROM snapshot_region WHERE "snapshotId" = '0e5a7b23-82dd-4fba-abfb-890dcfe754f6';DELETE FROM snapshot WHERE id = '0e5a7b23-82dd-4fba-abfb-890dcfe754f6';

方案 4:检查 runner 上报机制

availabilityScore=5 说明 runner 上报的分数很低。可以检查 runner 容器日志确认它是否正确上报资源信息:

docker logs daytona-runner-1 --tail 50

热门栏目