Docker 中使用 goose
这篇教程覆盖两个常见 Docker 场景:
- 把 goose 本身运行在 Docker 中
- goose 运行在宿主机,但扩展运行在容器里
场景一:在 Docker 中运行 goose
你可以直接在 Docker 容器中从源码构建并运行 goose。这样做不仅能提供更强的隔离和安全性,也能提升环境一致性和可移植性。比如你平时主要在 macOS 上开发,但要排查一个只出现在 Ubuntu 上的问题,那么用 Docker 就能很轻松地复现。
开始前,你通常需要根据自己的场景调整 Dockerfile 和 docker-compose.yml:
- 必须做的:在
docker-compose.yml中把 API key、provider 和 model 以环境变量形式显式传进去,因为在 Docker 中跑 Ubuntu 时,keyring 通常不可用。官方示例里使用的是 Google Gemini。 - 可选:把
Dockerfile的基础镜像换成你想要的 Linux 发行版。官方示例是 Ubuntu,但你也可以改成 CentOS、Fedora 或 Alpine。 - 可选:在
docker-compose.yml里挂载你个人的 goose 配置和 hints 文件,这样容器里可以直接复用你自己的设置。
自动化替代方案
如果你不想手动维护这些容器,可以直接看 Container-Use MCP 扩展,让 goose 通过对话帮你创建和管理容器。
配置好凭据后,可以先构建镜像:
docker-compose -f documentation/docs/docker/docker-compose.yml build
然后运行容器并连接进去:
docker-compose -f documentation/docs/docker/docker-compose.yml run --rm goose-cli
进入容器后,执行:
goose configure
如果它问你是否把 API key 保存进 keyring,选择 No,因为你已经通过环境变量把 key 传进来了。
接着你可以再运行一次 goose configure,补上你需要的扩展。
之后就可以启动会话:
goose session
这时你就已经可以在容器里使用带有扩展的 goose 了。
场景二:在容器中运行扩展
如果 goose 仍然跑在本机,但你希望扩展在某个 devcontainer 或运行中容器里执行,可以使用:
goose session --container <container-id-or-name>
这样 config.yaml 里配置的扩展会在指定容器中运行。
Requirements
- 容器里必须能找到扩展依赖和命令路径
- 如果要在容器里跑内建扩展,容器内部也要先安装 goose CLI
- 如果命令找不到,通常需要改成容器内的完整路径
示例
# 交互式会话,使用 config.yaml 里已有扩展
goose session --container my-dev-container
# 非交互模式运行
goose run --container my-dev-container --text "your instructions here"
# 指定一个扩展在容器中运行
goose session --container 4c76a1beed85 --with-extension "uvx mcp-server-fetch"
# 如果容器里找不到命令,可以改用完整路径
goose session --container 4c76a1beed85 --with-extension "/root/.local/bin/uvx mcp-server-fetch"
什么时候适合用 Docker
- 你需要隔离依赖和环境差异
- 你在调试跨平台问题
- 你想把 goose 工作流和 devcontainer / Codespaces 结合
- 你希望扩展直接在目标运行环境中执行
如果你不想手工管理容器,也可以考虑 Container-Use MCP 扩展,让 goose 帮你自动编排容器。