10 10
11本页涵盖[在开发容器中安装 Claude Code](#add-claude-code-to-your-dev-container),然后是一组独立的配置主题:在重建过程中保持身份验证、强制执行组织策略、限制网络出站流量以及无需权限提示即可运行。请阅读与您的设置相匹配的主题。11本页涵盖[在开发容器中安装 Claude Code](#add-claude-code-to-your-dev-container),然后是一组独立的配置主题:在重建过程中保持身份验证、强制执行组织策略、限制网络出站流量以及无需权限提示即可运行。请阅读与您的设置相匹配的主题。
12 12
13<Warning>13> [!WARNING]
14 虽然开发容器提供了实质性的保护,但没有任何系统能够完全免疫所有攻击。14>
15 当使用 `--dangerously-skip-permissions` 执行时,开发容器不会阻止恶意项目泄露容器内可访问的任何内容,包括存储在 [`~/.claude`](/docs/zh-CN/claude-directory) 中的 Claude Code 凭证。15> 虽然开发容器提供了实质性的保护,但没有任何系统能够完全免疫所有攻击。
16 仅在使用受信任的存储库进行开发时使用开发容器,并监控 Claude 的活动。16> 当使用 `--dangerously-skip-permissions` 执行时,开发容器不会阻止恶意项目泄露容器内可访问的任何内容,包括存储在 [`~/.claude`](/docs/zh-CN/claude-directory) 中的 Claude Code 凭证。
17 避免将主机密钥(如 `~/.ssh` 或云凭证文件)挂载到容器中;优先使用存储库范围或短期令牌。17> 仅在使用受信任的存储库进行开发时使用开发容器,并监控 Claude 的活动。
18</Warning>18> 避免将主机密钥(如 `~/.ssh` 或云凭证文件)挂载到容器中;优先使用存储库范围或短期令牌。
19 19
20<Accordion title="开发容器如何与您的编辑器配合工作">20> **开发容器如何与您的编辑器配合工作**
21 <img src="https://mintcdn.com/claude-code/YvJyjZfd9yMihr0i/images/devcontainer-architecture.svg?fit=max&auto=format&n=YvJyjZfd9yMihr0i&q=85&s=9017b1d16a446c6cc37ba562f35b9aae" className="dark:hidden" alt="显示主机上的编辑器连接到 Docker 开发容器的图表。Claude Code、终端和构建工具在容器内运行。主机存储库绑定挂载到容器中作为工作区。" width="640" height="300" data-path="images/devcontainer-architecture.svg" />21>
22 22> 
23 <img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/devcontainer-architecture-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=a0a340b1f2afc6a590696102c8acaaca" className="hidden dark:block" alt="显示主机上的编辑器连接到 Docker 开发容器的图表。Claude Code、终端和构建工具在容器内运行。主机存储库绑定挂载到容器中作为工作区。" width="640" height="300" data-path="images/devcontainer-architecture-dark.svg" />23>
24 24> 开发容器作为 Docker 容器运行,可以在您的机器上或云主机(如 GitHub Codespaces)上运行。支持 Dev Containers 规范的编辑器(如 VS Code、GitHub Codespaces、JetBrains IDE 或 Cursor)连接到该容器:您可以像往常一样在编辑器中浏览和编辑文件,但集成终端、语言服务器和构建工具都在容器内运行,而不是在主机上。不支持开发容器的编辑器(如纯 Vim)不属于此工作流。
25 开发容器作为 Docker 容器运行,可以在您的机器上或云主机(如 GitHub Codespaces)上运行。支持 Dev Containers 规范的编辑器(如 VS Code、GitHub Codespaces、JetBrains IDE 或 Cursor)连接到该容器:您可以像往常一样在编辑器中浏览和编辑文件,但集成终端、语言服务器和构建工具都在容器内运行,而不是在主机上。不支持开发容器的编辑器(如纯 Vim)不属于此工作流。25>
26 26> Claude Code 在容器内运行,因此它看到与项目工具链其余部分相同的文件、依赖项和工具。在 VS Code 中,您可以使用 [Claude Code 扩展面板](/docs/zh-CN/vs-code) 或在集成终端中运行 `claude`;两者都在容器内运行并共享相同的 `~/.claude` 配置。
27 Claude Code 在容器内运行,因此它看到与项目工具链其余部分相同的文件、依赖项和工具。在 VS Code 中,您可以使用 [Claude Code 扩展面板](/docs/zh-CN/vs-code) 或在集成终端中运行 `claude`;两者都在容器内运行并共享相同的 `~/.claude` 配置。27
28</Accordion>28## 在开发容器中添加 Claude Code
29
30<h2 id="add-claude-code-to-your-dev-container">
31 在开发容器中添加 Claude Code
32</h2>
33 29
34Claude Code 通过 [Claude Code Dev Container Feature](https://github.com/anthropics/devcontainer-features/tree/main/src/claude-code) 安装到任何开发容器中。30Claude Code 通过 [Claude Code Dev Container Feature](https://github.com/anthropics/devcontainer-features/tree/main/src/claude-code) 安装到任何开发容器中。
35 31
37 33
38当您在 VS Code 或 Codespaces 中打开容器时,该功能还会添加 Claude Code VS Code 扩展;其他编辑器会忽略该部分。34当您在 VS Code 或 Codespaces 中打开容器时,该功能还会添加 Claude Code VS Code 扩展;其他编辑器会忽略该部分。
39 35
40<Tip>36> [!TIP]
41 初次接触开发容器?[VS Code Dev Containers 教程](https://code.visualstudio.com/docs/devcontainers/tutorial) 会指导您安装 Docker、扩展和打开第一个容器。有关更完整的加固示例(包含防火墙和持久卷),请参阅[尝试参考容器](#try-the-reference-container)。37>
42</Tip>38> 初次接触开发容器?[VS Code Dev Containers 教程](https://code.visualstudio.com/docs/devcontainers/tutorial) 会指导您安装 Docker、扩展和打开第一个容器。有关更完整的加固示例(包含防火墙和持久卷),请参阅[尝试参考容器](#try-the-reference-container)。
39
40**1. 创建或更新 devcontainer.json**
43 41
44<Steps>42将以下内容保存为存储库中的 `.devcontainer/devcontainer.json`,或将 `features` 块添加到现有文件中。
45 <Step title="创建或更新 devcontainer.json">
46 将以下内容保存为存储库中的 `.devcontainer/devcontainer.json`,或将 `features` 块添加到现有文件中。
47 43
48 末尾的版本标签(如 `:1.0`)固定了功能的安装脚本,而不是 Claude Code 版本。该功能安装最新的 Claude Code,Claude Code 默认在容器内自动更新。44末尾的版本标签(如 `:1.0`)固定了功能的安装脚本,而不是 Claude Code 版本。该功能安装最新的 Claude Code,Claude Code 默认在容器内自动更新。
49 45
50 要固定 CLI 版本或禁用自动更新,请参阅[强制执行组织策略](#enforce-organization-policy)。46要固定 CLI 版本或禁用自动更新,请参阅[强制执行组织策略](#enforce-organization-policy)。
51 47
52 ```json .devcontainer/devcontainer.json theme={null}48```json .devcontainer/devcontainer.json theme={null}
53 {49{
54 "image": "mcr.microsoft.com/devcontainers/base:ubuntu",50 "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
55 "features": {51 "features": {
56 "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}52 "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
57 }53 }
58 }54}
59 ```55```
56
57将 `image` 行替换为您项目的基础镜像,或如果现有文件使用 Dockerfile,则将其删除。
60 58
61 将 `image` 行替换为您项目的基础镜像,或如果现有文件使用 Dockerfile,则将其删除。59Claude Code 功能在基础镜像未提供 Node.js 时会自行安装。如果该安装失败且构建停止并显示 `Failed to install Node.js and npm`,请将 `"ghcr.io/devcontainers/features/node:1": {}` 添加到上述 `features` 块中 Claude Code 功能之上,然后重新构建。
62 60
63 Claude Code 功能在基础镜像未提供 Node.js 时会自行安装。如果该安装失败且构建停止并显示 `Failed to install Node.js and npm`,请将 `"ghcr.io/devcontainers/features/node:1": {}` 添加到上述 `features` 块中 Claude Code 功能之上,然后重新构建。61**2. 重建容器**
64 </Step>
65 62
66 <Step title="重建容器">63在 Mac 上使用 `Cmd+Shift+P` 或在 Windows 和 Linux 上使用 `Ctrl+Shift+P` 打开 VS Code 命令面板,然后运行 **Dev Containers: Rebuild Container**。
67 在 Mac 上使用 `Cmd+Shift+P` 或在 Windows 和 Linux 上使用 `Ctrl+Shift+P` 打开 VS Code 命令面板,然后运行 **Dev Containers: Rebuild Container**。
68 64
69 对于其他工具,请按照该工具的重建操作:参阅 [GitHub Codespaces 中的重建](https://docs.github.com/en/codespaces/developing-in-a-codespace/rebuilding-the-container-in-a-codespace)、[Dev Containers CLI](https://github.com/devcontainers/cli) 或您的 IDE 的开发容器文档。65对于其他工具,请按照该工具的重建操作:参阅 [GitHub Codespaces 中的重建](https://docs.github.com/en/codespaces/developing-in-a-codespace/rebuilding-the-container-in-a-codespace)、[Dev Containers CLI](https://github.com/devcontainers/cli) 或您的 IDE 的开发容器文档。
70 </Step>
71 66
72 <Step title="登录 Claude Code">67**3. 登录 Claude Code**
73 在重建的容器中打开终端并运行 `claude`,然后按照身份验证提示进行操作。68
74 </Step>69在重建的容器中打开终端并运行 `claude`,然后按照身份验证提示进行操作。
75</Steps>
76 70
77您在身份验证提示处看到的内容取决于您的提供商:71您在身份验证提示处看到的内容取决于您的提供商:
78 72
83 77
84请参阅[选择您的 API 提供商](/docs/zh-CN/admin-setup#choose-your-api-provider)以决定哪条路径适合您的组织。78请参阅[选择您的 API 提供商](/docs/zh-CN/admin-setup#choose-your-api-provider)以决定哪条路径适合您的组织。
85 79
86<Note>80> [!NOTE]
87 如果浏览器登录完成但回调从未到达容器,请复制浏览器中显示的代码并将其粘贴到终端中的 `Paste code here if prompted` 提示处。当编辑器的端口转发不路由 localhost 回调时,可能会发生这种情况。81>
88</Note>82> 如果浏览器登录完成但回调从未到达容器,请复制浏览器中显示的代码并将其粘贴到终端中的 `Paste code here if prompted` 提示处。当编辑器的端口转发不路由 localhost 回调时,可能会发生这种情况。
89 83
90<h2 id="persist-authentication-and-settings-across-rebuilds">84## 在重建过程中保持身份验证和设置
91 在重建过程中保持身份验证和设置
92</h2>
93 85
94默认情况下,容器的主目录在重建时会被丢弃,因此工程师必须每次都重新登录。Claude Code 将其身份验证令牌、用户设置和会话历史存储在 [`~/.claude`](/docs/zh-CN/claude-directory) 目录下。它将您的 OAuth 账户、个人 MCP 服务器和按项目信任存储在 [`~/.claude.json`](/docs/zh-CN/settings-reference#global-config-settings) 中,这是该目录外的单独文件,因此仅在 `~/.claude` 处挂载卷不足以保持您的登录状态。在 `~/.claude` 处挂载一个命名卷,并将 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars) 设置为相同路径,以便 Claude Code 在卷内写入 `.claude.json`。86默认情况下,容器的主目录在重建时会被丢弃,因此工程师必须每次都重新登录。Claude Code 将其身份验证令牌、用户设置和会话历史存储在 [`~/.claude`](/docs/zh-CN/claude-directory) 目录下。它将您的 OAuth 账户、个人 MCP 服务器和按项目信任存储在 [`~/.claude.json`](/docs/zh-CN/settings-reference#global-config-settings) 中,这是该目录外的单独文件,因此仅在 `~/.claude` 处挂载卷不足以保持您的登录状态。在 `~/.claude` 处挂载一个命名卷,并将 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars) 设置为相同路径,以便 Claude Code 在卷内写入 `.claude.json`。
95 87
112 104
113要在 codespace 之间进行身份验证,请将 `ANTHROPIC_API_KEY` 或来自 [`claude setup-token`](/docs/zh-CN/authentication#generate-a-long-lived-token) 的 `CLAUDE_CODE_OAUTH_TOKEN` 存储为 [Codespaces 密钥](https://docs.github.com/en/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces)。Codespaces 会自动将密钥作为环境变量提供给容器内部。105要在 codespace 之间进行身份验证,请将 `ANTHROPIC_API_KEY` 或来自 [`claude setup-token`](/docs/zh-CN/authentication#generate-a-long-lived-token) 的 `CLAUDE_CODE_OAUTH_TOKEN` 存储为 [Codespaces 密钥](https://docs.github.com/en/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces)。Codespaces 会自动将密钥作为环境变量提供给容器内部。
114 106
115<h2 id="enforce-organization-policy">107## 强制执行组织策略
116 强制执行组织策略
117</h2>
118 108
119开发容器是应用组织策略的便利场所,因为相同的镜像和配置在每个工程师的机器上运行。109开发容器是应用组织策略的便利场所,因为相同的镜像和配置在每个工程师的机器上运行。
120 110
144 134
145要在容器内提供 [MCP 服务器](/docs/zh-CN/mcp),请在存储库根目录的 `.mcp.json` 文件中的[项目范围](/docs/zh-CN/mcp#mcp-installation-scopes)定义它们,以便它们与您的开发容器配置一起签入。在您的 Dockerfile 中安装本地 stdio 服务器依赖的任何二进制文件,并将远程服务器域添加到您的网络允许列表。135要在容器内提供 [MCP 服务器](/docs/zh-CN/mcp),请在存储库根目录的 `.mcp.json` 文件中的[项目范围](/docs/zh-CN/mcp#mcp-installation-scopes)定义它们,以便它们与您的开发容器配置一起签入。在您的 Dockerfile 中安装本地 stdio 服务器依赖的任何二进制文件,并将远程服务器域添加到您的网络允许列表。
146 136
147<h2 id="restrict-network-egress">137## 限制网络出站流量
148 限制网络出站流量
149</h2>
150 138
151您可以将容器的出站流量限制为仅 Claude Code 需要的域。有关推理和身份验证域,请参阅[网络访问要求](/docs/zh-CN/network-config#network-access-requirements),有关可选的遥测和错误报告连接以及如何禁用它们,请参阅[遥测服务](/docs/zh-CN/data-usage#telemetry-services)。139您可以将容器的出站流量限制为仅 Claude Code 需要的域。有关推理和身份验证域,请参阅[网络访问要求](/docs/zh-CN/network-config#network-access-requirements),有关可选的遥测和错误报告连接以及如何禁用它们,请参阅[遥测服务](/docs/zh-CN/data-usage#telemetry-services)。
152 140
153参考容器包含一个 [`init-firewall.sh`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/init-firewall.sh) 脚本,该脚本限制出站流量仅限于脚本允许的目标。在容器内运行防火墙需要额外的权限,因此参考通过 `runArgs` 添加 `NET_ADMIN` 和 `NET_RAW` 功能。防火墙脚本和这些功能对于 Claude Code 本身不是必需的:您可以将其省略并改为依赖您自己的网络控制。141参考容器包含一个 [`init-firewall.sh`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/init-firewall.sh) 脚本,该脚本限制出站流量仅限于脚本允许的目标。在容器内运行防火墙需要额外的权限,因此参考通过 `runArgs` 添加 `NET_ADMIN` 和 `NET_RAW` 功能。防火墙脚本和这些功能对于 Claude Code 本身不是必需的:您可以将其省略并改为依赖您自己的网络控制。
154 142
155<h2 id="run-without-permission-prompts">143## 无需权限提示即可运行
156 无需权限提示即可运行
157</h2>
158 144
159因为容器以非 root 用户身份运行 Claude Code 并将命令执行限制在容器内,您可以传递 `--dangerously-skip-permissions` 以进行无人值守操作。当以 root 身份启动时,CLI 会拒绝此标志,因此请确认 `remoteUser` 设置为非 root 账户。145因为容器以非 root 用户身份运行 Claude Code 并将命令执行限制在容器内,您可以传递 `--dangerously-skip-permissions` 以进行无人值守操作。当以 root 身份启动时,CLI 会拒绝此标志,因此请确认 `remoteUser` 设置为非 root 账户。
160 146
162 148
163如果您想要更少的提示而不禁用安全检查,请考虑改为[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),它有一个分类器在运行前审查操作。要完全防止工程师使用 `--dangerously-skip-permissions`,请在[托管设置](/docs/zh-CN/settings-reference#permission-settings)中将 `permissions.disableBypassPermissionsMode` 设置为 `"disable"`。149如果您想要更少的提示而不禁用安全检查,请考虑改为[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode),它有一个分类器在运行前审查操作。要完全防止工程师使用 `--dangerously-skip-permissions`,请在[托管设置](/docs/zh-CN/settings-reference#permission-settings)中将 `permissions.disableBypassPermissionsMode` 设置为 `"disable"`。
164 150
165<h2 id="try-the-reference-container">151## 尝试参考容器
166 尝试参考容器
167</h2>
168 152
169[`anthropics/claude-code`](https://github.com/anthropics/claude-code/tree/main/.devcontainer) 存储库包含一个示例开发容器,它结合了 CLI、出站防火墙、持久卷和基于 Zsh 的 shell。它作为工作示例而不是维护的基础镜像提供;在将其应用到您自己的配置之前,使用它来查看这些部分如何组合在一起。153[`anthropics/claude-code`](https://github.com/anthropics/claude-code/tree/main/.devcontainer) 存储库包含一个示例开发容器,它结合了 CLI、出站防火墙、持久卷和基于 Zsh 的 shell。它作为工作示例而不是维护的基础镜像提供;在将其应用到您自己的配置之前,使用它来查看这些部分如何组合在一起。
170 154
171<Steps>155**1. 安装先决条件**
172 <Step title="安装先决条件">156
173 安装 VS Code 和 [Dev Containers 扩展](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)。157安装 VS Code 和 [Dev Containers 扩展](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)。
174 </Step>158
159**2. 克隆参考**
160
161克隆 [Claude Code 存储库](https://github.com/anthropics/claude-code) 并在 VS Code 中打开它。
162
163**3. 在容器中重新打开**
175 164
176 <Step title="克隆参考">165出现提示时,点击 **Reopen in Container**,或从命令面板运行 **Dev Containers: Reopen in Container**。
177 克隆 [Claude Code 存储库](https://github.com/anthropics/claude-code) 并在 VS Code 中打开它。
178 </Step>
179 166
180 <Step title="在容器中重新打开">167**4. 启动 Claude Code**
181 出现提示时,点击 **Reopen in Container**,或从命令面板运行 **Dev Containers: Reopen in Container**。
182 </Step>
183 168
184 <Step title="启动 Claude Code">169容器完成构建后,使用 `` Ctrl+` `` 打开终端并运行 `claude` 以登录并启动您的第一个会话。
185 容器完成构建后,使用 `` Ctrl+` `` 打开终端并运行 `claude` 以登录并启动您的第一个会话。
186 </Step>
187</Steps>
188 170
189要将此配置用于您自己的项目,请将 `.devcontainer/` 目录复制到您的存储库中并为您的工具链调整 Dockerfile,或返回[在开发容器中添加 Claude Code](#add-claude-code-to-your-dev-container) 以仅将功能添加到您已有的设置中。171要将此配置用于您自己的项目,请将 `.devcontainer/` 目录复制到您的存储库中并为您的工具链调整 Dockerfile,或返回[在开发容器中添加 Claude Code](#add-claude-code-to-your-dev-container) 以仅将功能添加到您已有的设置中。
190 172
196| [`Dockerfile`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/Dockerfile) | 基础镜像、开发工具和 Claude Code 安装 |178| [`Dockerfile`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/Dockerfile) | 基础镜像、开发工具和 Claude Code 安装 |
197| [`init-firewall.sh`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/init-firewall.sh) | 限制出站网络流量仅限于脚本允许的目标 |179| [`init-firewall.sh`](https://github.com/anthropics/claude-code/blob/main/.devcontainer/init-firewall.sh) | 限制出站网络流量仅限于脚本允许的目标 |
198 180
199<h2 id="next-steps">181## 后续步骤
200 后续步骤
201</h2>
202 182
203Claude Code 在您的开发容器中运行后,下面的页面涵盖了组织推出的其余部分:选择身份验证路径、在存储库外交付托管策略、监控使用情况以及了解 Claude Code 存储和发送的内容。183Claude Code 在您的开发容器中运行后,下面的页面涵盖了组织推出的其余部分:选择身份验证路径、在存储库外交付托管策略、监控使用情况以及了解 Claude Code 存储和发送的内容。
204 184