Claude Code在拥有Docker沙箱的完全访问权限时,能够做什么,又不能做什么
Claude Code不仅能提出修改建议,还能编辑文件、安装依赖项、运行测试,并启动你的应用程序。 但让它独立完成任务会引发一个实际问题:这些命令应该被允许影响你计算机的哪些部分呢? 如果逐条审核这些命令,就能确保你在每个步骤中都能参与其中;而取消这些提示功能,虽然可以让Claude继续工作,但你仍然需要某种方式来限制它的权限。 Docker沙箱通过将Claude运行在一种轻量级的Linux虚拟机中,为这种权限控制提供了保障。这种虚拟机被称为微虚拟机,它能对你的项目和网络访问进行严格管控。 我想看看这种自由度到底有多实用,以及它的局限性在哪里。在Docker沙箱环境中,Claude为我的Fla
Claude Code不仅能提出修改建议,还能编辑文件、安装依赖项、运行测试,并启动你的应用程序。
但让它独立完成任务会引发一个实际问题:这些命令应该被允许影响你计算机的哪些部分呢?
如果逐条审核这些命令,就能确保你在每个步骤中都能参与其中;而取消这些提示功能,虽然可以让Claude继续工作,但你仍然需要某种方式来限制它的权限。
Docker沙箱通过将Claude运行在一种轻量级的Linux虚拟机中,为这种权限控制提供了保障。这种虚拟机被称为微虚拟机,它能对你的项目和网络访问进行严格管控。
我想看看这种自由度到底有多实用,以及它的局限性在哪里。在Docker沙箱环境中,Claude为我的Flask应用程序添加了一个健康检查接口,编写了测试用例,生成了Docker镜像,在容器中成功通过了所有测试,还确认了应用程序能够正常响应。整个过程它都没有要求我审核任何命令。
我还测试了Docker的两种项目模式。在直接模式下,沙箱中的Claude可以立即修改我Mac上的项目文件夹;而在克隆模式下,它会在一个独立的副本上进行处理,这样我就可以在将更改应用到原始项目之前先查看这些改动。之后,我又测试了Claude能够读取、修改或通过网络传输哪些文件。
在这篇文章中,你将了解到Docker沙箱能隔离哪些内容,这些测试揭示了什么信息,以及如何在自己的项目中使用Claude。你可以选择直接模式或克隆模式,配置网络访问权限,并在使用之前仔细检查Claude所完成的工作。
目录
先决条件
要按照本文中的步骤操作,你需要具备以下条件:
需要具备基本的终端操作技能,并熟悉Git的提交、分支以及差异对比功能。了解Docker镜像和容器的概念也会对后续的操作有所帮助。
需要使用运行macOS Sonoma 14或更高版本的Apple硅芯片Mac电脑,且该电脑上已安装了Homebrew及Git工具。本教程以macOS为例进行讲解;关于在其他支持平台上进行安装的详细信息,请参阅Docker官方文档:其他平台的安装指南。
需要拥有一个Docker账户,同时还需要订阅Claude服务,该订阅计划应包含Claude Code或Anthropic API密钥。下面我们会详细介绍登录流程。
需要准备一个可供操作的本地项目。如果要使用克隆功能,该项目必须是一个已经完成了初始提交的Git仓库。示例任务中使用了Flask框架,但你也可以根据自己的项目需求为Claude分配相应的任务。
您不需要在 Mac 上安装 Docker Desktop 或 Docker Engine。我们将直接安装 Docker 的 sbx 命令。
沙箱的隔离机制
您的计算机是主机,而沙箱则是运行在主机上的独立 Linux 环境。
普通的 Linux 容器会共享运行它们的 Linux 系统的内核,但 Docker 沙箱拥有自己的内核——这个内核负责管理进程及硬件访问。这样的设计使得沙箱的操作系统与主机的操作系统相互分离。
Claude 在沙箱内部拥有 sudo 权限,因此它可以像 Linux 管理员一样执行命令。例如,Claude 可以在沙箱内安装软件或修改系统文件。
不过这些权限并不会使 Claude 成为您 Mac 的管理员。您选择与 Claude 共享的文件夹拥有自己独立的访问规则。(来源:Docker 的隔离机制文档)
默认情况下,Docker 会通过以下命令在虚拟机中启动 Claude:
claude --dangerously-skip-permissions
这个选项会关闭 Claude 对常规工具使用的权限确认提示。实际上,是 Docker 负责控制对文件和网络资源的访问权限。您可以通过 Docker 的 sbx 命令在计算机上启动这个沙箱环境。(来源:Docker 的 Claude 集成文档)
Docker 沙箱提供了两种方式,让您的项目能够被 Claude 使用:
| 模式 | Claude 执行操作的位置 | >您计算机上的文件会发生什么变化 |
|---|---|---|
| 直接模式 | 您在计算机上选择的项目文件夹 | Claude 可以立即读取、修改、创建或删除该文件夹中的文件。 |
| 克隆模式 | 沙箱中会保存您 Git 项目的副本 | Claude 可以读取原始文件夹的内容,但其所做的任何修改都会留在沙箱内,直到您将它们导入到原始文件夹中。 |
在这两种模式下,Claude 都是在虚拟机内部运行的。直接模式只是让虚拟机获得了访问您计算机上特定文件夹的权限,并不意味着 Claude 是直接在您的 Mac 上运行的。
该图将Claude的工作环境与你的计算机其他部分区分开来。在虚拟机内部,Claude可以运行shell命令、安装软件以及创建私有文件。此外,它还配备了专用的Docker引擎,用于构建镜像和运行容器。
标记为“工作区挂载”的连接使得你的项目文件夹能够在沙箱环境中被访问。“主机检出”功能则允许Claude访问你计算机上的该项目文件夹。在直接模式下,Claude可以立即读取并修改这些文件;而在克隆模式下,Claude虽然能够读取原始文件夹的内容,但所有修改都会保存在虚拟机内的副本中。你可以先获取这些更改内容并进行审查,然后再将其应用到你的原始项目中。
网络连接图中的箭头展示了另一种受控制的连接方式:外出请求会首先经过你计算机上的代理服务器,该服务器会检查目标地址是否被允许访问。对于通过该代理管理的凭证信息,代理会为相关请求添加认证机制,这样即使不将API密钥存储在沙箱环境中,请求也能正常使用这些密钥。
被划掉的连接线表明:这些权限并不允许直接访问未共享的文件、运行计算机上的进程,或使用计算机上的Docker引擎。该图仅展示了基本配置情况,实际上还可以通过额外的集成方式或开放的应用程序端口来建立其他连接,而这些都需要你另行进行配置。
实验结果
在直接模式下,我让Claude删除了一个项目文件,并添加了一个Git钩子——这种脚本会在切换分支等操作时被执行。这两种更改都立即反映在了我的Mac上的项目文件夹中,这正是直接模式所提供的好处。
然而,这个钩子也存在一个问题:使用普通的`git diff`命令时,虽然能看到被删除的文件,但却看不到新添加的钩子。实际上,这些钩子是存储在仓库的`.git/hooks`目录中的,而这个目录并不包含在Git提交的常规文件列表中。我们并没有实际执行这个钩子脚本。
从这个实验中我们可以得出一个结论:在直接模式下审查代码时,可能还需要检查其他内容而不仅仅是代码差异。
在克隆模式下,Claude在虚拟机内的副本中删除了某个文件并提交了更改,但我的Mac上的原始项目文件并未受到影响。我可以先获取这个修改后的分支,查看其中的差异内容,然后再决定是否将其应用到实际项目中。需要注意的是,私有的Git钩子并不会随提交的内容一起被传输过来。
此外,Claude也无法读取我保存在Mac上另一个未共享文件夹中的测试文件。不过,在这两种模式下,它都可以正常访问项目内的文件。当我明确允许其与测试服务器建立网络连接时,Claude确实能够向该服务器发送有效的测试数据。保护文件不被修改并不意味着这些文件的内容就一定是保密的。
这些实验结果为我们提供了一个实际的选择方案:当你希望立即在编辑器中对文件进行修改时,可以使用直接模式;而当你想要先审查这些更改再决定是否将其应用到项目中时,则应该使用克隆模式。
这个实验仓库中包含了详细的实验步骤以及记录下的实验结果。你可以直接使用这些配置来测试你的项目,而无需使用其中的测试文件。
安装 Docker Sandboxes 并登录
我在一台运行苹果硅处理器的 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 来更新它。通过运行 sbx version 命令可以查看当前使用的版本号。本实验中的测试结果是基于 v0.43.0 版本得出的。(如需更多信息,请参阅 Docker 的安装说明。)
sbx login 命令会让你登录到 Docker 系统中。而 Claude 需要单独进行身份验证。如果你使用的是 Anthropic API 密钥,可以在 Mac 上运行以下命令来保存该密钥,并在系统提示时输入密钥:
sbx secret set anthropic
如果你选择使用 Claude 的订阅服务,则可以跳过这个步骤。在沙箱环境中启动 Claude 后,你可以在其界面中输入 /login 来完成登录操作。
请不要将你的 API 密钥保存在项目的源代码文件或 .env 文件中。因为 Claude 可以访问这些文件夹,即使是在克隆模式下也是如此。请按照上述步骤进行身份验证,以便让 Claude 连接到你的账户。(更多详细信息,请参阅 Docker 关于 Claude 认证流程的说明。)
选择 Claude 所需的网络访问权限
Claude 可能需要互联网连接,以便与其模型提供者进行通信、下载所需的依赖项或获取代码文件。Docker 的网络预设设置决定了沙箱可以连接到哪些目的地:
| 预设名称 | 默认访问规则 |
|---|---|
| Open | 允许广泛的出站网络连接 |
| Balanced | 允许使用常见的开发服务,包括模型 API 和包管理仓库;其他目的地被禁止访问。 |
| Locked Down | 预设本身不允许任何目的地的连接;你需要通过自定义 Docker 配置来添加允许连接的规则。 |
对于新安装的环境,可以在 Mac 的终端中执行以下命令来设置 Balanced 预设:
sbx policy init balanced
这样就可以为所有沙箱环境设定统一的访问规则。如果你已经选择了某个预设,也可以直接使用它。在创建沙箱后,我们会为你的项目检查这些规则设置。你还可以通过调整 Docker 代理的配置来添加额外的规则;而对于由组织统一管理的安装环境,可能会存在更多的限制措施。(更多详细信息,请参阅 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选项用于选择克隆模式,选项则可以防止沙箱使用Docker共享的代理指令和脚本存储。
名称my-project用于标识这个沙箱。之后您可以在Mac上的任何目录下使用这个名称来重新打开该沙箱。在创建沙箱时,您可以选择直接模式或克隆模式;即使以后使用不同的命令参数重新连接沙箱,其模式也不会发生改变。(更多相关信息,请参阅Docker关于Git工作流的指南。)
检查沙箱的网络配置规则,然后启动Claude:
sbx policy ls my-project --wide
sbx run --name my-project
此时您的终端会显示正在沙箱中运行的Claude。如果您使用了Claude的订阅服务,请在Claude的输入提示处输入/login,然后按照登录指示进行操作。请在Claude内部输入/login,而不是在Mac的shell环境中输入。
现在您可以让Claude开始处理您的项目了。可以先从一些较小的修改入手,这样就可以立即看到修改结果。以我实验中使用的Flask应用程序为例,您可以执行以下操作:
创建一个名为sandbox/health-check的分支,添加一个GET /health的接口,使其返回{"status":"ok"}这个响应;为这个接口编写测试用例并运行测试,然后将这些更改提交到该分支上。不要将更改推送到外部远程仓库。请告诉我哪些文件发生了变化,以及测试是否通过。
对于其他项目,只需将示例中的操作替换为您自己需要进行的修改即可。请保留名为sandbox/health-check的分支,并运行测试,以便能够获得具体的测试结果进行查看。
在使用之前先检查修改内容
在直接模式下,当Claude正在处理项目时,您可以在Mac上直接查看项目的文件变化情况。Claude所做的所有修改都会立即反映在项目中。任务完成后,请仔细检查这些变更,并同时查看.git/hooks文件以及代码本身,因为实验表明,普通的差异对比工具可能会忽略一些本地添加的钩子文件。
在克隆模式下,Claude创建的分支会一直留在沙箱内部,直到您将其取出并应用到实际项目中。请保持沙箱处于运行状态,然后在原始项目文件夹中打开另一个终端窗口。对于上面提到的示例任务,可以执行以下命令:
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指的是你刚刚下载到的那个提交版本。执行“fetch”操作并不会更改你的工作文件。请先查看差异报告,然后再通过常规的Git流程将这些变更应用到你的项目中。如果你使用了不同的分支名称,请在“fetch”命令中使用相应的分支名。(更多相关信息,请参阅Docker关于从沙箱环境中获取代码的指南。)
“克隆模式”会在你的项目收到任何修改之前为你提供审核的机会。不过,这种模式并不能确保被提出的代码能够自动安全地运行。因此,请务必仔细审查对构建脚本及其他可执行文件的修改内容,同时也要检查应用程序代码本身。
将无关的敏感信息隔离在Claude的访问范围之外
在“克隆模式”下,你的原始项目文件夹在沙箱环境中也是可读的——这包括那些被Git忽略的文件。因此,即使你从未将这些文件提交到版本控制系统中,其中包含的数据库密码等敏感信息也可能被读取到。
在启动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可以在不影响你在Mac上运行的容器的情况下,利用Docker进行开发工作。(来源: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
删除沙箱环境会清除其中的所有私有数据。在删除之前,请确保已经备份了那些你想要保留的文件。在“克隆模式”下,对项目文件夹所做的任何修改都会保留在你的Mac上;删除沙箱环境并不会撤销这些修改。(更多相关信息,请参阅Docker关于如何管理沙箱环境的指南。)
结论
实验结果表明,Claude能够完成从编辑代码、测试程序到运行应用程序整个开发流程,而无需我逐一批准每一条指令。Docker沙箱为这些开发活动提供了专门的环境,而“项目模式”和网络规则则决定了Claude可以访问哪些资源。
关键在于你需要决定何时让Claude所做的修改生效:在“直接模式”下,修改会立即反映到项目中;而在“克隆模式”下,你可以先查看已提交的修改内容,再决定是否将其应用到项目中。无论是哪种模式,项目文件中的敏感信息都不会被隐藏起来。
现在你已经掌握了在沙箱环境中使用Claude的步骤,包括如何设置其访问权限、运行应用程序以及获取它的处理结果。对于那些可以自动运行的任务,我通常会选择“克隆模式”,将不必要的敏感信息从项目文件夹中删除,然后再仔细检查修改内容并测试结果,再决定是否最终应用这些修改。
相关文章
Xcode 27.2引入了一种适合用于项目配置的、能够被代理程序及合并工具顺利处理的JSON格式。
苹果推出了一种基于JSON的新格式,用于Xcode项目配置文件,以此取代传统的基于属性列表的格式。这种新格式从Xcode 27.2版本开始提供,其目的是提升代码的可读性、简化维护工作,并使人工智能编程助手能够更轻松地理解并修改项目配置文件。 作者:塞尔吉奥·德·西蒙内
阅读全文
奥尔森与索德奎斯特在OSS欧盟会议上讨论了Valkey技术的演变过程以及其在未来缓存应用中的潜在用途。
Valkey是一个正在发展中的项目,它是在两年前作为Redis的一个分支而启动的。目前有来自不同公司的12位维护者和9位委员会成员在参与这个项目的开发工作。最近,该项目在性能方面取得了显著提升,集群功能也得到了改进;同时,开发者还计划添加同步复制和分层存储等功能。此外,该项目也非常重视安全性,并通过自动化手段来提高代码发布的效率。 作者:Olimpiu Pop
阅读全文
Akka测试:在65个开源项目中运用规范驱动的方式来实现人工智能技术的应用
Akka使用了65个开源项目来研究规范结构、上下文环境、模型选择、自动化验证机制以及相应的约束条件如何影响人工智能辅助下的软件移植过程。实验测定了各种因素对开发时间、代码量、测试结果以及程序性能的影响,发现不同模型、不同的开发投入水平以及不同类型的项目在这些方面存在显著差异。 作者:Leela Kumili
阅读全文
如何使用Next.js、AWS以及沙箱环境来构建属于自己的、类似于Lovable这样的AI应用开发工具
像Lovable、Bolt这样的工具,第一次使用的时候真的会让人觉得像是魔法一样。说实话,我第一次看到这类东西的时候简直惊呆了……而且这一切都是通过聊天窗口来完成的!真是太不可思议了。第一次尝试使用Lovable的时候,我甚至产生了一场关于“存在意义”的哲学思考。 但你们有没有想过,其实这些工具内部到底发生了什么?比如说,究竟是怎么让一个应用程序能够生成另一个可以用于测试、分享或下载的应用程序的呢? 显然,在某个地方有一个AI模型在编写代码。但这个过程具体是如何进行的呢?那些代码需要被安装、编译并运行才行。而我有点怀疑的是,现在似乎没有人会在这些代码运行之前去仔细检查它们。这些代码可能会出现错
阅读全文