# 使用沙箱快速创建您的远程开发环境

![overview](https://cdnv2.udelivrs.com/2026/06/4c4d712338615dd562ace934d6cd20d2_1781578748732.png)

想要快速搭建一个开箱即用的远程开发环境？UCloud沙箱可以帮助你！将开发环境搭建在沙箱里面，有如下好处：

- 不受限于本地环境和资源，几秒快速启动一个完整的开发环境。
- 通过我们的域名来访问开发环境，不需要自己购买外网IP，并且数据安全传输。
- 放心执行AI生成的不可信代码。
- 在vibe coding的过程中，AI只能读取到受限沙箱里面的代码，无法窃取真实机器上的敏感数据。
- 当不想用的时候，可以暂停运行的沙箱，保留所有数据（包括内存），下次再想用的时候只要访问服务即可自动拉起，极大节约成本。

下面，我们将手把手带您演示如何利用沙箱启动一个自己的远程开发环境。

## 准备

我们将会使用Python来构建开发环境，首先，创建一个项目，并安装好相应依赖：

```bash
mkdir codeagent
cd codeagent
python3 -m venv venv
source ./venv/bin/activate
pip3 install e2b==2.24.0 # 使用e2b兼容模式来创建沙箱
```

设置一些环境变量，以连接我们提供的沙箱服务：

```bash
export E2B_DOMAIN='cn-wlcb.sandbox.ucloudai.com'
export E2B_API_KEY='<api-key>'
```

API Key可以从[星图平台密钥管理](https://astraflow.ucloud.cn/modelverse/api-keys)来获取。

## 构建codeagent模板

您需要构建一个模板，来运行code server以进行远程开发，下面是一个示例：

```python
from e2b import Template, default_build_logger, wait_for_port

# code-server 登录密码（请改成你自己的强密码）
CODE_SERVER_PASSWORD = "ucloud123"

template = (
    Template()
    .from_ubuntu_image("22.04")
    .run_cmd("curl -fsSL https://code-server.dev/install.sh | sh")
    # 预装 Claude Code 和 Codex 插件（均在 code-server 默认的 Open VSX 商店）
    # 装到运行时用户 user 的扩展目录，确保启动后能直接加载
    .run_cmd(
        "code-server "
        "--extensions-dir /home/user/.local/share/code-server/extensions "
        "--install-extension anthropic.claude-code "
        "--install-extension openai.chatgpt"
    )
    # 创建默认工作目录
    .run_cmd("mkdir -p /home/user/app")
    # 关闭 Workspace Trust 弹窗（自动信任所有文件夹）
    .run_cmd(
        "mkdir -p /home/user/.local/share/code-server/User && "
        "echo '{\"security.workspace.trust.enabled\": false}' "
        "> /home/user/.local/share/code-server/User/settings.json"
    )
    # 通过环境变量注入密码，配合 --auth password 即可用密码登录
    .set_envs({
        "PASSWORD": CODE_SERVER_PASSWORD,
    })
    # 启动沙箱时拉起 code-server，绑定 0.0.0.0:8080 以便外网通过代理访问
    # 末尾的 /home/user/app 即 code-server 默认打开的工作目录
    .set_start_cmd(
        "code-server --bind-addr 0.0.0.0:8080 --auth password --disable-telemetry /home/user/app",
        wait_for_port(8080),
    )
)

Template.build(
    template,
    alias="codeagent-test",  # 模板别名（必填）
    cpu_count=4,  # CPU 核心数
    memory_mb=4096,  # 内存（MB）
    on_build_logs=default_build_logger(min_level='debug'),
)
```

使用python执行上面的代码以构建模板：

```bash
python3 ./template.py
```

你应该可以看到模板构建的日志，当出现`Build finished`字样，表示构建已经完成。

您可以自定义上面的构建过程，加入一些自己的配置和脚本，也可以在上面通过`run_cmd`来安装一些开发环境，例如`C/C++`，`Java`，`Go`，`Rust`等编程环境，都可以在上面的构建模板过程中完成安装。

## 启动远程开发环境

为了保证我们的开发环境能一直保留，在启动沙箱的时候，需要配置`autoresume`，这个参数可以让沙箱在超时之后被自动暂停，之后只要访问开发环境的URL即可自动恢复，不需要再手动去恢复沙箱了。

通过这种机制，可以实现：

- 当开发环境很久没有被操作的时候，被自动暂停，节约后台资源占用和成本。内存和系统盘数据全部保留。
- 只要开发环境被访问，即使它正处于暂停状态，也可以自动恢复，马上可以恢复到上一次的工作状态。

您可以把它理解为一个配置了自动休眠的电脑，当您长时间不工作的时候它会自动休眠，而只要您开始工作它会立刻恢复到上一次的工作状态。

下面的代码可以启动一个远程开发环境：

```python
import argparse
import json
import os

from e2b import Sandbox

# 解析命令行参数：git 仓库地址
parser = argparse.ArgumentParser(description="启动 codeagent 沙箱并 clone 代码")
parser.add_argument("git_url", help="要 clone 到沙箱工作目录的 git 仓库地址")
args = parser.parse_args()

# 从本地环境变量读取 API Key，用于配置沙箱内的 Claude Code / Codex
api_key = os.environ.get("E2B_API_KEY")
if not api_key:
    parser.error("环境变量 E2B_API_KEY 未设置")

# 沙箱内的工作目录
REMOTE_WORKDIR = "/home/user/app"

sandbox = Sandbox.create(
    template="codeagent-test",

    # 沙箱超时时间，10分钟，超过这个时间沙箱会被暂停
    timeout=10 * 60,

    # 设置autoresume，当沙箱超时之后会自动暂停，当有网络请求的时候会自动恢复
    lifecycle={
        "on_timeout": "pause",
        "auto_resume": True,
    },
)

print(f'Sandbox id: {sandbox.sandbox_id}')

# 在沙箱里 git clone，替换掉工作目录
#   先清空已存在的工作目录，再 clone 到该目录（git clone 要求目标目录为空）
print(f'Cloning {args.git_url} -> {REMOTE_WORKDIR} ...')
sandbox.commands.run(f"rm -rf {REMOTE_WORKDIR}")
sandbox.commands.run(f"git clone {args.git_url} {REMOTE_WORKDIR}")

print(f'Code cloned to {REMOTE_WORKDIR}')

# 配置 Claude Code：写入 ~/.claude/settings.json
print('Configuring Claude Code ...')
claude_settings = {
    "env": {
        "ANTHROPIC_AUTH_TOKEN": api_key,
        "ANTHROPIC_BASE_URL": "https://api.modelverse.cn",
        "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1",
    },
    "effortLevel": "max",
}
sandbox.commands.run("mkdir -p /home/user/.claude")
sandbox.files.write(
    "/home/user/.claude/settings.json",
    json.dumps(claude_settings, indent=2),
)

# 配置 Codex：写入 ~/.codex/config.toml 和 ~/.codex/auth.json
print('Configuring Codex ...')
codex_config = """\
model_provider = "ucloud"
model = "gpt-5.5"
model_reasoning_effort = "xhigh"

[model_providers.ucloud]
name = "ucloud"
base_url = "https://api.modelverse.cn/v1"
wire_api = "responses"
requires_openai_auth = true
"""
codex_auth = {"OPENAI_API_KEY": api_key}
sandbox.commands.run("mkdir -p /home/user/.codex")
sandbox.files.write("/home/user/.codex/config.toml", codex_config)
sandbox.files.write("/home/user/.codex/auth.json", json.dumps(codex_auth, indent=2))

print(f'Code agent address: {sandbox.get_host(8080)}')
```

上面的脚本会启动一个远程开发环境，然后使用git clone一个项目到开发环境中。

使用示例：

```bash
python3 ./start.py https://github.com/ucloud/ucloud-sandbox-sdk-python.git
```

脚本会有类似下面的输出：

```text
Sandbox id: <sandbox-id>
Cloning https://github.com/ucloud/ucloud-sandbox-sdk-python.git -> /home/user/app ...
Code cloned to /home/user/app
Code agent address: 8080-<sandbox-id>.cn-wlcb.sandbox.ucloudai.com
```

在浏览器打开`8080-<sandbox-id>.cn-wlcb.sandbox.ucloudai.com`，即可看到远程开发环境。

上面的脚本会读取您的API Key，并生成Claude Code和Codex配置，以让Claude Code和Codex直接连接[modelverse](https://astraflow.ucloud.cn/modelverse/playground)，如果您不需要它们默认连接modelverse，或者需要使用别的模型，可以修改或删除对应的代码。

## 使用Claude Code或Codex

如果您使用我上面的示例代码启动的开发环境，则环境已经默认安装好了Claude Code和Codex，并且已经默认使用您创建沙箱的API Key连接到了ModelVerse。

您可以直接开始快乐地Vibe coding了：

![claude code](https://cdnv2.udelivrs.com/2026/06/a11471f090bb0335ac9a084255505357_1781578748719.png)

## 暂停开发环境

一般来说，当沙箱超时之后，开发环境会被默认暂停，您无需手动暂停，但是您也可以通过代码的方式来手动暂停沙箱：

```python
import argparse

from e2b import Sandbox

parser = argparse.ArgumentParser(description="暂停一个沙箱")
parser.add_argument("sandbox_id", help="要暂停的沙箱ID")
args = parser.parse_args()

sandbox = Sandbox.connect(args.sandbox_id)

sandbox.pause()

print(f'沙箱 {sandbox.sandbox_id} 已暂停')
```

## 销毁开发环境

当您不再需要使用沙箱了，可以使用下面代码来销毁它：

```python
import argparse

from e2b import Sandbox

parser = argparse.ArgumentParser(description="销毁一个沙箱")
parser.add_argument("sandbox_id", help="要销毁的沙箱ID")
args = parser.parse_args()

sandbox = Sandbox.connect(args.sandbox_id)

sandbox.kill()

print(f'沙箱 {sandbox.sandbox_id} 已销毁')
```

## 快照

如果您在您的开发环境做了一些变更，例如安装了一些插件，做了一些特殊的配置，您希望将这些配置永久保留，以后可以使用同样的配置快速创建相同的开发环境，则可以将沙箱保存为快照，以后可以通过快照来快速启动新的沙箱。

使用下面的代码即可创建快照：

```python
import argparse

from e2b import Sandbox

parser = argparse.ArgumentParser(description="创建一个快照")
parser.add_argument("sandbox_id", help="要创建快照的沙箱ID")
args = parser.parse_args()

sandbox = Sandbox.connect(args.sandbox_id)

snapshot = sandbox.create_snapshot()
print('Snapshot ID:', snapshot.snapshot_id)
```

执行代码：

```bash
python3 ./create-snapshot.py <sandbox-id>
```

您会看到快照id被打印出来：

```text
Snapshot ID: <snapshot-id>
```

使用下面的代码，用快照创建新的沙箱：

```python
import argparse

from e2b import Sandbox

parser = argparse.ArgumentParser(description="从快照创建一个沙箱")
parser.add_argument("snapshot_id", help="快照ID")
args = parser.parse_args()

sandbox = Sandbox.create(args.snapshot_id)

print(f'Sandbox id: {sandbox.sandbox_id}')
print(f'Code agent address: {sandbox.get_host(8080)}')
```

这样，您就可以实现一个类似于**沙箱克隆**的效果了。