文章

容器中首次启动 Claude Code 的三个阻碍与解决方案

全新容器中的 Claude Code 不会自动开始工作:它会依次停在新手引导、目录信任确认和 API Key 确认这三个提示前。在无人交互的终端中,这些问题会导致进程无限挂起,必须在启动前将正确配置预写入代理配置文件中。

一个启动后输出横幅然后静止不动的代理依然在产生字节。在日志中,产生字节看起来就像正常运行。在全新容器中,Claude Code 在开始任何实际工作前会停顿三次,每一次都是在向一个空无一人的终端发问。

Three gates in a row. An agent passes the first two and stops at the third.onboardingtrustapi keya fresh container
顺序至关重要。一个已经回答了前两个问题的代理依然会阻塞在第三个问题上。

代理按序遇到的三道关卡

关卡提示内容
首次启动引导助手选择视觉效果最佳的文本主题
工作区信任检查这是你创建或信任的项目目录吗?
服务商密钥确认你是否要使用此 API Key?

第一道和第三道关卡是机器全局性的。第二道关卡按目录记录。只解决其中一两道关卡只会让代理前进相应步数,依然无法真正开始工作。

实测对比矩阵

下表每行数据均基于 claude 2.1.220 在真实 pty 和全新 HOME 目录下实测得出:

预置配置代理实际行为
无任何预置阻塞在主题选择器
仅在 settings.json 中配置 theme依然阻塞在主题选择器
在 .claude.json 中预置 hasCompletedOnboarding进入目录信任确认对话框
额外预置 resolved 路径的 hasTrustDialogAccepted进入提示符,显示 "Not logged in"
额外在环境变量中注入 ANTHROPIC_API_KEY阻塞在 "Do you want to use this API key?"
额外预置 customApiKeyResponses.approved成功进入工作状态,显示 "API Usage Billing"

目录信任路径中的解析陷阱

信任记录保存在 ~/.claude.jsonprojects[path] 下,且路径必须为符号链接解析后的真实路径。在 macOS 上 mkdtempSync 返回 /var/folders/…,而真实路径为 /private/var/folders/…。写入未解析的路径会导致配置失效,提示框依然弹出。

export function trustKeyFor(root: string): string {
  try {
    return realpathSync(root);
  } catch {
    return root;
  }
}

密钥确认中的暗坑

API Key 确认提示最容易出错,因为其默认选项是 2. No (recommended)。CLI 记录的并不是完整密钥,而是密钥后 20 个字符的批准令牌。

export function approvalTokenFor(apiKey: string): string {
  return apiKey.slice(-20);
}

两条无效的捷径

命令行参数 --permission-mode bypassPermissions 无法跳过目录信任对话框,它只影响工具执行权限。预置未解析路径同样无效。

主题只是外观偏好,删除文件则是严肃决策。

预置配置消除了环境启动的冗余交互,但绝不能破坏关键的安全判断。我们不会跳过敏感工具调用时的必要确认。

const trust: ProjectTrust = {
  hasTrustDialogAccepted: true,
  hasCompletedProjectOnboarding: true,
  projectOnboardingSeenCount: 0,
  allowedTools: [],
};

关于云端运行环境的解析请参阅 在云端运行 Claude Code,连接控制细节请参阅 观察不属于你的终端

直接回答

为什么 Claude Code 在容器中首次启动时会卡住?

它并不是发生死锁,而是在等待交互式回答(选择主题、信任工作区目录和确认 API Key)。在没有人工输入的终端中,进程会永久等待。

如何非交互式地运行 Claude Code?

在启动前将引导完成状态和工作区信任记录直接写入 ~/.claude.json,并通过环境变量注入凭据,即可实现静默启动直接进入工作。

这些数据是如何测量的?

使用 2.1.220 版本的 Claude Code 在真实的 pty 环境中进行实测,通过分析 CLI 实际写入的文件结构得出结论。