容器中首次启动 Claude Code 的三个阻碍与解决方案
全新容器中的 Claude Code 不会自动开始工作:它会依次停在新手引导、目录信任确认和 API Key 确认这三个提示前。在无人交互的终端中,这些问题会导致进程无限挂起,必须在启动前将正确配置预写入代理配置文件中。
一个启动后输出横幅然后静止不动的代理依然在产生字节。在日志中,产生字节看起来就像正常运行。在全新容器中,Claude Code 在开始任何实际工作前会停顿三次,每一次都是在向一个空无一人的终端发问。
代理按序遇到的三道关卡
| 关卡 | 提示内容 |
|---|---|
| 首次启动引导助手 | 选择视觉效果最佳的文本主题 |
| 工作区信任检查 | 这是你创建或信任的项目目录吗? |
| 服务商密钥确认 | 你是否要使用此 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.json 的 projects[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 实际写入的文件结构得出结论。