最近团队在试 AI Coding Agent。最开始大家盯着的是模型:能不能读懂代码、能不能改 bug、能不能生成测试。
实际跑下来,第一个卡点不是模型,而是工具链。
Agent 要完成一个真实任务,通常需要调用浏览器、Git、数据库、文件系统、K8s 日志或内部 API。也就是说,它背后不只是一个聊天模型,而是一组 MCP Server 和工具容器。
我这次把工具链放进容器里跑了一遍,记录一下踩到的点。
工具链不是一个包
一个最小可用的 Coding Agent 工具链,至少会碰到这些组件:
| 组件 | 用途 |
|---|---|
| Node/Python runtime | 跑脚本、工具、适配器 |
| Playwright / Browser | 复现页面、截图、E2E |
| MCP Server | 暴露工具能力 |
| Gateway | 管理工具调用入口 |
| Git 工具 | 读仓库、生成 patch |
| K8s 工具 | 查 Pod、日志、事件 |
如果这些都装在个人电脑上,短期很快,长期很乱。版本、权限、网络、依赖都不可复现。
所以我更倾向于把工具链容器化。
第一件事:先拉镜像
我先不急着 compose up,而是按来源拆镜像:
bash
docker pull docker.1ms.run/node:20-alpine
docker pull ghcr.1ms.run/github/github-mcp-server
docker pull mcr.1ms.run/playwright/mcp
docker pull k8s.1ms.run/pause:3.10
这里故意保留了不同来源:Docker Hub、GHCR、MCR、K8s。因为实际项目里,失败经常不是"Docker 坏了",而是其中一个上游来源卡住。
如果这一层不过,后面再调 Agent 没意义。
compose 先跑最小集
先写一个很小的 compose.yaml:
yaml
services:
runner:
image: docker.1ms.run/node:20-alpine
working_dir: /workspace
volumes:
- ./workspace:/workspace:ro
command: ["node", "--version"]
browser:
image: mcr.1ms.run/playwright/mcp
ports:
- "8931:8931"
github-tool:
image: ghcr.1ms.run/github/github-mcp-server
environment:
- GITHUB_TOKEN=${GITHUB_TOKEN}
先看配置:
bash
docker compose config
docker compose pull
docker compose up -d
我不会一开始就把数据库、K8s、内部 API 都接进来。先让最小工具链跑起来,再逐个加能力。
工具权限从只读开始
Agent 一旦能调工具,权限就变成正经工程问题。
我把权限分成几档:
| 工具 | 默认策略 |
|---|---|
| 仓库 | 只读,写入通过 PR |
| 浏览器 | 只允许访问测试环境 |
| 数据库 | 只读账号,优先样例库 |
| 文件系统 | 只挂载 workspace |
| K8s | 只读 namespace |
这一步会让 demo 慢一点,但能避免后面出现"Agent 到底改了什么"的黑盒问题。
K8s 环境要看事件
如果工具链要进 K8s,第一步不是看应用日志,而是看 Pod 事件。
bash
kubectl describe pod <pod-name>
kubectl get events --sort-by=.lastTimestamp
如果看到 ImagePullBackOff,优先看镜像地址和节点网络。
如果镜像已经拉下来但容器反复重启,再看启动参数和工具配置。
这两个问题不要混在一起排。
为什么这事适合做成团队模板
AI Coding Agent 的工具链,一旦每个人都自己装,很快会变成玄学:
- A 同事能跑,B 同事不能跑。
- CI 里缺一个浏览器依赖。
- K8s 节点拉不到某个工具镜像。
- 数据库 token 在本地有,在 runner 里没有。
- Agent 输出错误,但不知道是模型错还是工具错。
把工具链容器化之后,至少能把问题拆开:
- 镜像是否能拉取。
- 工具是否能启动。
- 权限是否足够。
- Agent 调用参数是否正确。
- 输出是否可复现。
我最后留下的检查脚本
bash
#!/usr/bin/env bash
set -euo pipefail
images=(
"docker.1ms.run/node:20-alpine"
"ghcr.1ms.run/github/github-mcp-server"
"mcr.1ms.run/playwright/mcp"
"k8s.1ms.run/pause:3.10"
)
for image in "${images[@]}"; do
echo "==> ${image}"
docker pull "${image}"
done
docker compose config
docker compose pull
这段脚本不解决所有问题,但能把"工具链镜像能不能进入环境"这件事提前暴露出来。
小结
AI Coding Agent 真要进入团队,不能只看模型能力。
更现实的问题是:MCP 工具链怎么跑、浏览器自动化怎么隔离、镜像怎么预检、权限怎么收口、日志怎么留痕。
我的建议是先别追求一步到位。先把最小工具链容器化跑通,再把权限、日志、K8s 和 CI 逐步加上去。
Agent 会不会干活是一回事,它有没有一个稳定的工作台,是另一回事。