当某个 Kit 的 install 或 startup 命令失败时,sbx 会告诉你是哪条命令失败了、属于哪个 Kit,以及完整输出在哪里。本页讲解如何阅读这些输出、在沙箱内找到日志,以及修复常见原因。
阅读进度输出
在 sbx create 和 sbx run 期间,配置智能体阶段会为每个 Kit 操作打印一行:install 命令、init 文件、文件复制、环境变量,以及它注册的 startup 命令。完成的行会显示 ✓ 和耗时,失败的行会显示 ✗ 和退出码。
如果 Kit 设置了 description,命令行就会显示它。否则显示命令的前 60 个字符。命令行还会显示拥有该命令的 Kit(kit=<name>)以及它以哪个用户运行(user=<uid>)。
为每条 install 和 startup 命令设置 description,这样这一行就能说明命令的用途。保持简短:一行最多只显示它的 60 个字符。
capabilities:
- type: com.docker.sandbox/lifecycle@1
config:
install:
- command: apt-get update && apt-get install -y ripgrep
user: "0"
description: Install ripgrep
startup:
- command: rg --version > /tmp/rg-version
description: Record the ripgrep version这个 Kit 的各行看起来是这样的:
AGENT
running 1 install command
✓ Install ripgrep (kit=my-kit, user=0, 12.4s)
view install logs: ls /var/log/sbx-kits
registering 1 startup command, run on every container start
○ Record the ripgrep version (kit=my-kit, user=agent)
view startup log: cat /var/log/sbx-kit-startup.log查看失败的 install 命令
失败的 install 命令会在该行下方打印其输出的最后 40 行,紧接着是一行 docker run 命令,它在 Kit 的基础镜像上运行同一条命令:
✗ Install ripgrep (kit=my-kit, user=0, exit 100)
── captured output ──
E: Failed to fetch http://deb.debian.org/debian/dists/bookworm/InRelease 403 Forbidden
E: Unable to locate package ripgrep
──────────────────────
hint: reproduce locally with:
docker run --rm -u 0 <base-image> sh -c 'apt-get update && apt-get install -y ripgrep'复制这行 docker run 命令,就可以在每次都重新创建沙箱之外反复调试该命令。改动命令、再次运行,然后把可用的版本复制回 Kit。这个复现运行在普通 Docker 中,位于沙箱之外,因此沙箱的网络策略不适用。如果命令在那里能正常工作,却在沙箱中失败,请先检查该 Kit 的网络规则。
在沙箱内查找日志
进度输出只显示失败命令的末尾部分。沙箱会保留完整的记录:
| 日志 | 内容 |
|---|---|
/var/log/sbx-kits/<kit>/install-<n>.log | 一条 install 命令的完整输出。<n> 是该命令在该 Kit 的 install 列表中的位置,从 0 开始。 |
/var/log/sbx-kit-startup.log | 每次容器启动时所有 startup 命令的输出。 |
用 sbx exec 读取其中任一日志:
$ sbx exec my-sandbox cat /var/log/sbx-kits/my-kit/install-0.log
$ sbx exec my-sandbox cat /var/log/sbx-kit-startup.logStartup 命令会在每次容器启动时运行。每条命令都会向 startup 日志写入以下几行:
> <script>
# <kit>: <description or command>
<the command's output>
ok <script>失败的命令会以 fail <script> exit=<code> 结尾,而不是 ok。它还会阻止其后的 startup 命令继续执行,而启动该沙箱的命令(sbx create、sbx run、sbx stop 之后的 sbx exec,或 sbx kit add)会打印一条警告,指向 startup 日志并附带它的最后几行。沙箱仍然可用。
创建阶段结束后,智能体会接管终端。沙箱内的日志才是你可以回头查阅的记录。
用 -D 显示全部内容
给 sbx create 或 sbx run 传入全局调试标志:
$ sbx -D create --name my-sandbox shell --kit ./my-kit加上 -D 后,每条成功的 install 命令也会在它那一行下方流式输出完整内容,并且 sbx 会在沙箱启动后打印 startup 日志。
sbx 会屏蔽哪些内容
Kit 命令打印的所有内容都会经过同一个过滤器到达你的终端。它会移除终端转义序列,并把已知形态的凭据(例如 GitHub、GitLab、OpenAI、Anthropic 和 AWS 令牌、JSON Web Token、私钥以及 Authorization 请求头)替换成 <GITHUB_TOKEN> 这样的占位符。这个过滤器可以防止命令意外回显你自己的机密信息,例如 env 输出中的令牌,或者配置转储中的密钥。它不是针对刻意构造的输出的防护手段,也不会改动你写进 Kit 自身命令文本中的机密信息。沙箱内的 install 日志保留原始输出。
常见原因
install 命令无法访问它的软件包源
日志中显示无法解析的域名,或者来自 apt、pip、npm 的 HTTP 403 响应。该 Kit 在 install 阶段的网络规则没有包含这个软件包镜像仓库。把它加到 com.docker.sandbox/network-policy@1 能力的 install.allow 中。例如,apt 的镜像仓库可能与命令中写的主机不是同一台。
两个 Kit 同时运行 apt
日志中显示 Could not get lock /var/lib/dpkg/lock-frontend。另一条 install 命令或基础镜像的设置占用了 dpkg 锁。在 Kit 中重试该软件包命令,例如给 apt-get 加上 -o DPkg::Lock::Timeout=120。
startup 命令需要某个没有安装成功的工具
在针对该工具的 install 命令失败之后,startup 日志显示 exec: <tool>: not found。请先修复 install 命令。查看它的 install-<n>.log,然后重新运行沙箱。
命令需要 root 权限
当命令写入系统路径或安装软件包时,日志显示 Permission denied,并且该行显示 user=1000。在 install 命令上设置 user: "0",或者改为写入智能体用户拥有的位置。