Claude Code 开发容器提供隔离环境,让团队所有成员获得一致的工具链和依赖。配置 devcontainer.json 添加 Claude Code 功能(ghcr.io/anthropics/devcontainer-features/claude-code:1.0),挂载卷持久化凭据(mounts 到 ~/.claude),设置 containerEnv 禁用自动更新和遥测。限制出站流量时使用 init-firewall.sh 只允许白名单域;配合 --dangerously-skip-permissions 可实现无人值守运行(需非 root 用户)。对于无法绕过策略的场景,使用 server-managed settings 或 MDM。
Claude Code Dev Container 配置:隔离沙箱与无人值守权限跳过
在团队中运行 Claude Code 时,使用开发容器(Dev Container)可以获得一致的、隔离的环境。Claude Code 安装在容器内,其执行的命令运行在容器中,而项目文件的编辑会直接反映到本地仓库。
本页覆盖以下配置场景,每节独立,可跳转:
安全说明:开发容器提供实质性保护,但无法完全抵御所有攻击。使用
--dangerously-skip-permissions时,恶意项目仍可能泄露容器内可访问的内容(包括~/.claude中的 Claude Code 凭据)。建议仅在开发受信任的仓库时使用,并持续监控 Claude 的活动。避免挂载主机凭据(如~/.ssh或云凭据文件)到容器中,优先使用仓库范围或短期令牌。
开发容器如何在编辑器中工作
开发容器作为 Docker 容器运行,可在本地机器或云端(如 GitHub Codespaces)运行。支持 Dev Containers 规范的编辑器(VS Code、GitHub Codespaces、JetBrains IDE、Cursor)连接到该容器:在编辑器中浏览和编辑文件,但集成终端、语言服务器和构建工具都在容器内运行。不支持容器的编辑器(如纯 Vim)不适合此工作流。
Claude Code 在容器内运行,因此它看到相同的文件、依赖和工具。在 VS Code 中,可以使用 Claude Code 扩展面板 或在集成终端中运行 claude;两者都在容器内运行并共享相同的 ~/.claude 配置。
添加 Claude Code 到你的 Dev Container
通过 Claude Code Dev Container Feature 可安装到任何 dev container 中。
该设置适用于任何支持 Dev Containers 规范的工具(VS Code、GitHub Codespaces、JetBrains IDE)。以下步骤以 VS Code 为例。在 VS Code 或 Codespaces 中打开容器时,功能也会自动添加 Claude Code VS Code 扩展;其他编辑器忽略该部分。
首次接触 dev container?参考 VS Code Dev Containers 教程:安装 Docker、扩展并打开第一个容器。需要更完整的防火墙和持久化示例,请参阅 参考容器。
-
将以下内容保存为仓库中的
.devcontainer/devcontainer.json,或将features块添加到已有文件。末尾版本标签(如:1.0)固定的是功能的安装脚本,不是 Claude Code 版本。功能会安装最新 Claude Code,且 Claude Code 默认在容器内自动更新。要固定 CLI 版本或禁用自动更新,请参见强制执行组织策略。{ "image": "mcr.microsoft.com/devcontainers/base:ubuntu", "features": { "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {} } }将
image替换为项目的基础镜像,如果已有文件使用 Dockerfile 则删除它。 -
在 VS Code 中按
Cmd+Shift+P(Mac)或Ctrl+Shift+P(Windows/Linux)打开命令面板,运行 Dev Containers: Rebuild Container。其他工具请遵循其重建操作:见 GitHub Codespaces 重建、Dev Containers CLI 或 IDE 文档。 -
在重建后的容器中打开终端,运行
claude,然后按照认证提示操作。
认证提示的内容取决于你的提供商:
- Anthropic:通过浏览器使用 Claude 或 Anthropic Console 账户登录
- Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry:Claude Code 使用云提供商凭据,无需浏览器提示
对于云提供商,通过 containerEnv、Codespaces 密钥或云工作负载身份将凭据作为环境变量传入容器,而不是从主机挂载凭证文件。参见 Amazon Bedrock、Google Vertex AI 或 Microsoft Foundry 获取 Claude Code 读取的凭据链。
如果浏览器登录完成但回调未到达容器,请复制浏览器中显示的代码并粘贴到终端的
Paste code here if prompted提示处。当编辑器的端口转发未路由本地主机回调时可能发生。
跨重建持久化认证和设置
默认情况下,容器的 home 目录在重建时会被丢弃,因此工程师每次都需要重新登录。Claude Code 将认证令牌、用户设置和会话历史存储在 ~/.claude 中。挂载一个命名卷到该路径可跨重建保留这些状态。
以下示例为 node 用户的 home 目录挂载卷:
"mounts": [
"source=claude-code-config,target=/home/node/.claude,type=volume"
]
将 /home/node 替换为容器 remoteUser 的 home 目录。如果卷挂载到 ~/.claude 以外的位置,设置 CLAUDE_CONFIG_DIR 指向挂载路径,Claude Code 会读写那里。
要按项目隔离状态而非跨所有仓库共享一个卷,请在源名称中包含 ${devcontainerId} 变量。参考配置 使用 source=claude-code-config-${devcontainerId} 实现这一点。
在 GitHub Codespaces 中,~/.claude 在停止和启动 codespace 间持续存在,但重建容器时仍会被清除,因此上述卷挂载也适用于此处。要跨 codespaces 携带认证,请将 ANTHROPIC_API_KEY 或通过 claude setup-token 生成的 CLAUDE_CODE_OAUTH_TOKEN 存储为 Codespaces 密钥;Codespaces 自动将密钥作为环境变量提供给容器。
强制执行组织策略
开发容器是应用组织策略的便利位置,因为相同的镜像和配置运行在每个工程师的机器上。
Claude Code 在 Linux 上读取 /etc/claude-code/managed-settings.json,其在设置层次中优先级最高,因此这些值会覆盖工程师在 ~/.claude 或项目 .claude/ 目录中设置的内容。通过 Dockerfile 将文件复制到位:
RUN mkdir -p /etc/claude-code
COPY managed-settings.json /etc/claude-code/managed-settings.json
由于 Dockerfile 位于仓库中,任何有写入权限的人都可以更改或删除此步骤。对于工程师无法通过编辑仓库文件绕过的策略,请通过服务器托管设置或 MDM 交付托管设置。参见托管设置文件了解可用键及其他交付路径。
要为容器中的每个 Claude Code 会话设置环境变量,请将它们添加到 devcontainer.json 的 containerEnv 中。以下示例退出遥测和错误报告,并阻止 Claude Code 在安装后自动更新:
"containerEnv": {
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
"DISABLE_AUTOUPDATER": "1"
}
Dev Container Feature 始终安装最新的 Claude Code 版本。要为可重复构建固定特定 Claude Code 版本,请从 Dockerfile 使用 npm install -g @anthropic-ai/claude-code@X.Y.Z 安装,而不是使用 feature,并如上所示设置 DISABLE_AUTOUPDATER。
有关策略控制的完整列表(包括权限规则、工具限制和 MCP 服务器允许列表),请参阅为组织设置 Claude Code。
要使 MCP 服务器 在容器内可用,请在仓库根目录的 .mcp.json 文件中以项目范围定义它们,以便与 dev container 配置一同签入。在 Dockerfile 中安装本地 stdio 服务器所依赖的二进制文件,并将远程服务器域添加到网络允许列表。
限制网络出口
可以限制容器的出站流量仅限 Claude Code 所需的域。参见网络访问要求了解推理和认证域,以及遥测服务了解可选的遥测和错误报告连接及如何禁用它们。
参考容器包含一个 init-firewall.sh 脚本,该脚本阻止除 Claude Code 和开发工具所需域之外的所有出站流量。在容器内运行防火墙需要额外权限,因此参考容器通过 runArgs 添加了 NET_ADMIN 和 NET_RAW 能力。防火墙脚本和这些能力对于 Claude Code 本身并非必需:可以省略并依赖自己的网络控制。
无权限提示运行
由于容器以非 root 用户运行 Claude Code 并将命令执行限制在容器内,可以传递 --dangerously-skip-permissions 进行无人值守操作。当以 root 启动时,CLI 会拒绝此标志,因此请确认 remoteUser 设置为非 root 账户。
跳过权限提示会消除在工具调用运行前审查的机会。Claude 仍然可以修改绑定挂载的工作区中的任何文件(这些修改直接出现在主机上),以及容器网络策略允许的任何内容。将此标志与网络出口限制结合,以限制被绕过会话可访问的范围。
如果希望减少提示但又不完全禁用安全检查,请考虑自动模式,该模式在操作前有分类器审查。要完全阻止工程师使用 --dangerously-skip-permissions,请将 permissions.disableBypassPermissionsMode 设置为 "disable"(在托管设置中)。
尝试参考容器
anthropics/claude-code 仓库包含一个示例 dev container,该容器结合了 CLI、出口防火墙、持久化卷和 Zsh 基础 shell。它作为工作示例提供,而非维护的基础镜像;在应用于自己的配置之前,可用它了解各组件如何配合。
- 安装 VS Code 和 Dev Containers 扩展
- 克隆 Claude Code 仓库并在 VS Code 中打开
- 出现提示时,点击 Reopen in Container,或从命令面板运行 Dev Containers: Reopen in Container
- 容器构建完成后,按
Ctrl+`打开终端,运行claude登录并开始第一个会话
要使用此配置到自己的项目,请将 .devcontainer/ 目录复制到仓库中,并根据工具链调整 Dockerfile,或回到将 Claude Code 添加到 dev container 仅添加功能到现有设置。
参考配置由三个文件组成。当通过功能将 Claude Code 添加到自己的 dev container 时,它们都不是必需的,但它们展示了一种组合这些组件的方式。
| 文件 | 用途 |
|---|---|
devcontainer.json |
卷挂载、runArgs 能力、VS Code 扩展和 containerEnv |
Dockerfile |
基础镜像、开发工具和 Claude Code 安装 |
init-firewall.sh |
阻止除允许域外所有出站网络流量 |
下一步
Claude Code 在开发容器中运行后,以下页面覆盖组织部署的其余部分:选择认证路径、在仓库外部交付托管策略、监控使用情况以及了解 Claude Code 存储和发送的内容。
- 为组织设置 Claude Code:选择认证提供商、决定策略如何到达设备、规划部署
- 服务器托管设置:从 Claude.ai 管理控制台交付托管策略,使工程师无法通过编辑仓库文件绕过
- 监控使用情况和审计活动:导出 OpenTelemetry 指标并审查团队正在运行的内容
- 网络访问要求:代理和防火墙的完整域允许列表
- 遥测服务和退出选项:Claude Code 默认发送的内容及禁用的环境变量
- 探索 .claude 目录:卷挂载包含的内容(凭据、设置、会话历史)
- 沙箱环境:比较开发容器与内置 Bash 沙箱、自定义容器和虚拟机
- 安全模型:Claude Code 的权限系统、沙箱和提示注入保护如何配合
- 权限模式:从计划模式到自动模式再到绕过模式的全范围,以及何时使用每种模式
常见问题
Dev Container 中 --dangerously-skip-permissions 安全吗?
在非 root 用户且网络出口受限制的 dev container 中使用是相对安全的,但风险并未完全消除。恶意项目仍可能泄露容器内的凭据(如 ~/.claude 中的令牌)。仅用于受信任的仓库,并配合出口防火墙使用。如果不需要完全跳过提示,考虑自动模式(auto mode)。
重建 dev container 后需要重新登录怎么办?
挂载命名卷到 ~/.claude 可持久化认证和设置。例如 "mounts": ["source=claude-code-config,target=/home/node/.claude,type=volume"]。如果在 Codespaces 中,也可将 ANTHROPIC_API_KEY 或 CLAUDE_CODE_OAUTH_TOKEN 存储为 Codespaces 密钥。
如何组织内部强制固定 Claude Code 版本且禁用自动更新?
使用 Dockerfile 方式安装:npm install -g @anthropic-ai/claude-code@X.Y.Z,然后在 devcontainer.json 中设置 "containerEnv": {"DISABLE_AUTOUPDATER": "1"}。Dev Container Feature 始终安装最新版本,无法版本固定。