← 返回
IT技术

Claude Code 在 Docker 沙箱中拥有完全访问权限时能做什么和不能做什么

✍️ zhirenhun 📅 2026/10/7 👁 194 阅读 ⏱ 25 分钟
Claude Code 在 Docker 沙箱中拥有完全访问权限时能做什么和不能做什么

Claude Code 不仅能提出修复建议,还能编辑文件、安装依赖、运行测试并启动你的应用。

但让它自行完成任务会引发一个实际问题:这些命令应该被允许影响你的电脑的哪些部分?

逐条批准命令能让你全程参与。去掉这些提示词后 Claude 可以持续工作,但你仍需要一种方法来限制它的访问。

Docker Sandboxes 通过在一个受控的轻量级 Linux 虚拟机(称为 microVM)中运行 Claude 来提供这种边界,对你的项目和网络进行受控访问。

我想看看这种自由到底有多实用,以及它的边界在哪里。在 Docker 沙箱中,Claude 为我的 Flask 应用添加了健康端点,编写了测试,构建了 Docker 镜像,在容器中通过了全部三项测试,并验证了应用是否能正常响应。整个过程未要求我批准任何命令。

我还测试了 Docker 的两种项目模式。在直接模式下,沙箱中的 Claude 能够立即修改我 Mac 上的项目文件夹。在克隆模式下,它在沙箱内的一个独立副本上工作,这样我就能在将更改应用到原始项目之前先行审查。随后我测试了 Claude 能够读取、修改以及通过网络发送哪些文件。

本文将介绍 Docker Sandboxes 隔离的内容,这些测试揭示了什么,以及如何在你的项目中使用沙箱运行 Claude。你将在直接模式和克隆模式之间选择,配置网络访问,并在使用前审查 Claude 的工作。

目录

前置条件

按照本文中的操作进行,你需要:

您的 Mac 不需要安装 Docker Desktop 或 Docker Engine。我们将在下面安装 Docker 的 sbx 命令。

沙盒隔离了什么

您的计算机是 宿主机。沙盒是在其上运行的独立 Linux 环境。

普通 Linux 容器共享其运行的 Linux 系统内核。Docker Sandbox 拥有自己的内核,即管理进程和硬件访问的操作系统部分。这使得沙盒的操作系统与宿主机的操作系统相互隔离。

Claude 在沙盒内拥有 sudo 权限,因此可以以 Linux 管理员身份运行命令。例如,Claude 可以在沙盒中安装软件或修改系统文件。

这些权限不会让 Claude 成为您的 Mac 的管理员。您选择与 Claude 共享的文件夹具有自己的访问规则。(来源:Docker 的隔离文档)

Docker 的 Claude 集成默认使用此命令在虚拟机中启动 Claude:

claude --dangerously-skip-permissions

该标志禁用了 Claude 的普通工具批准提示。Docker 提供隔离并控制对文件和网络目标的访问。您可以在本地计算机上使用 Docker 的 sbx 命令启动此环境。(来源:Docker 的 Claude Code 集成文档)

Docker Sandbox 提供两种方式让 Claude 访问您的项目:

模式 Claude 工作的位置 您计算机上的文件将如何处理
直接模式 您在计算机上选择的项目文件夹 Claude 可以立即读取、修改、创建和删除该文件夹中的文件。
克隆模式 沙盒内的您的 Git 项目的独立副本 Claude 可以读取原始文件夹,但其编辑会保留在沙盒中,直至您检索并应用它们。

在两种模式下,Claude 都运行在虚拟机中。直接模式授予该虚拟机修改您计算机上特定文件夹的权限。这并不意味着 Claude 直接在您的 Mac 上运行。

该图示将 Claude 的工作环境与您计算机的其他部分隔离开来。在虚拟机内,Claude 可以运行 shell 命令、安装软件并创建私有文件。它还拥有一个独立的 Docker 引擎,用于构建镜像和运行容器。

标记为 “Workspace mount” 的连接将您的项目文件夹暴露在沙盒中。“Host checkout” 指的是您计算机上的该项目文件夹。在直接模式下,Claude 可以立即读取并修改这些文件。在克隆模式下,Claude 可以读取原始文件夹,但会在虚拟机内的独立副本中进行修改。您可以检索其提交并审查后再将其应用到原始项目。

网络箭头显示另一个受控连接。出站请求会经过您计算机上的代理,该代理会检查目标是否被允许。对于通过该代理管理的凭据,代理会在请求匹配的服务时添加身份验证。这样请求就可以使用 API 密钥,而无需在沙盒中存储该密钥。

被划掉的连接表明这些权限不提供:直接访问未共享的文件、正在运行的进程或您计算机上的 Docker 引擎。该图示展示了基本配置。额外的集成和已发布的应用程序端口会创建您需要单独配置的连接。

实验表明了什么

在直接模式下,我让 Claude 删除一个项目文件并添加一个 Git 钩子——这是 Git 在切换分支等操作期间可执行的脚本。这两项更改立即出现在我 Mac 上的项目文件夹中。这就是直接模式所配置提供的访问权限。

普通的 git diff 显示了已删除的文件,但没有显示新的钩子。钩子位于仓库的 .git/hooks 目录,这超出了 Git 在提交中通常包含的文件范围。我们没有运行该钩子。

经验表明,审查直接模式会话可能需要检查的内容不仅限于代码差异。

在克隆模式下,Claude 在其私有副本中删除了一个文件并提交了更改。我 Mac 上的原始项目保持不变。我可以获取该分支并在应用任何更改之前检查其差异。私有 Git 钩子并未随获取的提交一起出现。

Claude 也无法读取我放在 Mac 上一个独立且未共享的文件夹中的测试文件。但在两种模式下,它都能读取项目内部的文件。当我显式允许与测试服务器建立网络连接时,Claude 能够向该服务器发送可读的测试值。防止文件被编辑并不能使其内容保密。

这些发现指向一个实际的选择:如果你希望在编辑器中立即进行编辑,请使用直接模式;如果你希望在更改项目之前先审查工作,请使用克隆模式。

实验仓库 包含了详细的过程和 记录的结果。在使用下面的设置与你自己的项目时,你不需要它的测试文件。

安装 Docker 沙箱并登录

我在搭载 Apple 硅的 Mac 上使用了 sbx v0.43.0。Mac 的安装需要 macOS Sonoma 14 或更高版本。你的 Mac 上不需要安装 Docker Desktop 或 Docker Engine。在 Mac 的终端中运行以下命令:

brew trust docker/tap
brew install docker/tap/sbx
sbx login
sbx version

如果 sbx 已经安装,使用 brew upgrade docker/tap/sbx 进行更新。版本命令会告诉你当前使用的版本。实验结果基于 v0.43.0。(如需更多信息,请参阅 Docker 的安装说明。)

sbx login 登录 Docker。Claude 需要单独的身份验证。如果你使用 Anthropic API 密钥,请在 Mac 上运行以下命令并按提示输入密钥进行存储:

sbx secret set anthropic

如果你使用 Claude 订阅,则跳过该命令。在沙盒中启动 Claude 后,在 Claude 的界面中输入 /login。

不要在你提供给 Claude 的项目的源文件或 .env 文件中保存 API 密钥。Claude 可以读取该文件夹,包括克隆模式。使用上面的身份验证步骤将 Claude 连接到你的账户(如需更多信息,请参阅 Docker 关于 Claude Code 身份验证的指南。)

选择 Claude 需要的网络访问

Claude 可能需要互联网访问以联系其模型提供方、下载依赖或检索代码。Docker 的网络预设决定沙盒可以连接到哪些目标:

预设 起始规则
Open 广泛的出站网络访问
Balanced 允许常见的开发服务,包括模型 API 和包注册表。其他目标将被拒绝。
Locked Down 该预设本身不允许任何目标。您或智能体的 Docker 配置必须添加许可。

对于新安装,从你的 Mac 终端初始化 Balanced:

sbx policy init balanced

这会在你的沙盒之间建立规则。如果你已经选好了预设,可以直接使用。创建沙盒后,我们会检查你项目的规则。Docker Agent 配置可以添加规则,组织管理的安装可能会施加额外限制。(如需了解更多信息,请参阅 Docker 网络预设文档。)

在你的项目中启动 Claude

在你的 Mac 上打开终端,切换到你的项目文件夹。将下面的路径替换为你的项目位置:

cd /path/to/your/project

选择以下任意一个命令。两者都将沙盒命名为 my-project,因此只需使用对应您想要模式的命令。

直接模式下,Claude 的编辑会立即在此文件夹中出现:

sbx create --name my-project --skills=off claude .

克隆模式下,Claude 会在沙箱中编辑一份独立的副本:

sbx create --name my-project --clone --skills=off claude .

克隆模式需要 Git 仓库。在创建沙盒前,提交你希望 Claude 以此为基础的起始代码。每条命令末尾的 . 表示你终端所在的项目文件夹。--clone 选择克隆模式。--skills=off 阻止此沙盒使用 Docker 共享的代理指令和脚本存储。

名称 my-project 标识此沙盒。之后,你可以在 Mac 任何目录中使用该名称重新打开它。创建沙盒时,你选择直接模式或克隆模式。使用不同标志重新连接不会改变其模式。(要了解更多信息,请参阅 Docker 的 Git 工作流指南。)

检查其网络规则,然后启动 Claude:

sbx policy ls my-project --wide
sbx run --name my-project

您的终端现在显示在沙盒中运行的 Claude Code。如果您使用的是 Claude 订阅,请在 Claude 的输入提示符处输入 /login 并按照登录说明操作。请在 Claude 中输入 /login,而不是在您的 Mac shell 中输入。

现在您可以让 Claude 在项目上工作。先从一个您可以验证结果的小改动开始。比如像我实验中那样的 Flask 应用,您可以使用:

Create a branch named sandbox/health-check. Add GET /health returning
{"status":"ok"}, write a test for it, and run the tests. Commit the changes
on that branch. Do not push to an external remote. Tell me which files
changed and whether the tests passed.

对于另一个项目,将端点任务替换为你自己的更改。保持命名分支并请求运行测试,以便你有一个具体的结果可供审查。

使用前审查工作

在直接模式下,在你的 Mac 上检查项目,随着 Claude 的工作进行。其文件更改已经存在。完成后,审查更改并检查 .git/hooks 以及代码,因为实验表明普通 diff 可能会遗漏本地钩子。

在克隆模式下,Claude 的分支会停留在沙盒中,直到你检索它。保持沙盒运行并在你的原始项目文件夹中打开第二个 Mac 终端。对于上面的示例任务,运行:

git fetch sandbox-my-project sandbox/health-check
git diff --stat HEAD FETCH_HEAD
git diff HEAD FETCH_HEAD

Docker 创建名为 sandbox-my-project 的 Git 远程,以便您可以从沙盒获取提交。FETCH_HEAD 指的是您刚刚下载的提交。获取操作不会更改您的工作文件。阅读差异,然后通过您常规的 Git 流程检出或合并工作。如果您选择了不同的分支名称,请在获取命令中使用它。(要了解更多信息,请参阅 Docker 关于从沙盒获取工作的指南。)

克隆模式在编辑到达您的项目之前提供一个审查步骤。它不会自动使提议的代码安全可运行。审查构建脚本和其他可执行文件的更改,以及应用程序代码。

将无关的机密隔离在 Claude 之外

克隆模式使您的原始项目文件夹在沙盒内可读。这包括 Git 忽略的文件。即使您从未提交过,包含数据库密码的 .env 文件也可能因此可读。

在启动 Claude 之前,检查项目文件夹中是否有任务不需要的 API 密钥、数据库密码和其他凭据。将这些文件移出您提供给沙盒的文件夹。.gitignore 控制哪些文件被 Git 忽略。它不会阻止 Claude 读取这些文件。(来源: Docker 关于克隆模式下文件访问的文档)

网络规则是此决策的另一部分。在我的测试中,Docker 阻止了对 example.com 的请求,但允许对我显式许可的服务器的请求。该被允许的请求携带了从项目读取的数据。目标规则控制 Claude 连接的位置,而不控制它发送的内容。

要阻止沙盒的特定目标,请在您的 Mac 上运行以下命令:

sbx policy deny network --sandbox my-project example.com
sbx policy check network --sandbox my-project example.com

将 example.com 替换为您想要阻止的目标。使用 sbx policy log 检查下载或请求失败时的连接决策。 (要了解更多信息,请参阅 Docker 配置网络访问的指南。)

运行应用并在浏览器中打开

Claude 可以在其沙盒内使用 Docker Engine 构建镜像并运行容器。这与您 Mac 上的 Docker 是独立的。

在我的实验中,应用容器出现在沙盒的 Docker 列表中,而在 Mac 的 Docker 列表中未出现,一直处于运行状态。这使得 Claude 能够使用 Docker 进行开发,而无需获得您在 Mac 上运行的容器的控制权。 (来源: Docker 的 Docker Engine 隔离文档。)

要查看 Web 应用,请让 Claude 在沙盒内启动它,监听 0.0.0.0:8000,并保持运行。 然后在您的 Mac 上运行以下命令:

sbx ports my-project --publish 8080:8000
open http://localhost:8080

这会把你 Mac 上的 8080 端口连接到沙盒中的 8000 端口。如果应用在沙盒内的 Docker 容器中运行,先让 Claude 把容器应用端口发布到沙盒的 8000 端口。

需要建立两个连接:先从容器到沙盒,再从沙盒到你的 Mac。(如需更多信息,请参阅 Docker 关于在沙盒内访问应用的指南。)

在不丢失工作的情况下停止沙盒

退出 Claude 不会删除沙盒。其文件、已安装的软件和 Docker 状态在停止和重启后仍然存在。要停止它,在你的 Mac 上运行以下命令:

sbx stop my-project

以后想重新打开同一环境时:

sbx run --name my-project

不再需要这个环境时,直接删除即可:

sbx rm my-project

删除沙盒会删除其私有内容。在删除沙盒之前,获取您想保留的任何 clone‑mode 分支。在 direct mode 下,您对项目文件夹所做的更改仍会保留在 Mac 上。删除沙盒不会撤销这些更改。(如需更多信息,请参阅Docker 管理沙盒指南。)

结论

实验表明, Claude 能够在我不需要逐条批准命令的情况下,通过编辑、测试和运行应用程序来完成开发任务。Docker Sandboxes 为该工作提供了独立环境,项目模式和网络规则决定了 Claude 能访问什么。

主要取决于您希望 Claude 的编辑何时生效于项目。direct mode 会立即使其可见;clone mode 让您在应用更改前有机会审查已提交的更改。两种方式都不会让项目文件里的可读凭证变为私有。

您现在已有在沙盒中启动 Claude、选择其访问权限、运行应用程序并检索其工作的步骤。对于无人值守的任务,我会使用 clone mode,从项目文件夹中删除不必要的凭证,并在应用更改前审查更改和测试结果。

——

广告 广告
🧑‍💻

zhirenhun

一个热爱技术的程序员,喜欢分享前沿AI知识和开发经验。