1.1 - 构建
e2b仓库源码构建
背景
代码仓库:
https://github.com/e2b-dev/E2B
准备工作
clone仓库
mkdir -p ~/work/code/e2b
cd ~/work/code/e2b
git clone git@github.com:e2b-dev/E2B.git
cd E2B
安装 pnpm
npm install -g pnpm
安装后查看版本:
$ pnpm --version
9.15.5
构建
参考代码仓库下的 Makefile 文件:
https://github.com/e2b-dev/E2B/blob/main/Makefile
codegen
先执行:
pnpm install
再执行:
make codegen
过程中会比较慢,因为要下载这个 2GB 的镜像文件 codegen-env:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
codegen-env latest ea38a80a213c 16 minutes ago 2.07GB
执行完成之后,packages/js-sdk/node_modules/.bin/ 下就会存在 npm-run-all 文件:
$ ls packages/js-sdk/node_modules/.bin/
eslint knip ncu openapi-typescript run-s tsup
glob knip-bun npm-check-updates playwright tsc tsup-node
json2ts msw npm-run-all run-p tsserver vitest
python sdk
Python SDK 的代码生成包含 API 客户端、Protobuf 通信层和数据模型定义:
- API 客户端代码(OpenAPI Client 生成):
(注意:日志显示它先生成在 api/api 目录,然后被 mv 移动到了 client 目录)
- 主 API 客户端模块:packages/python-sdk/e2b/api/client/ (包含了与 E2B 后端交互的所有 Pydantic 模型和请求客户端)
- 云盘 (Volume) API 客户端模块:packages/python-sdk/e2b/volume/client/
- 容器内通信协议代码(Buf / Protobuf 生成):
- 由 buf generate 执行生成的 Proto 文件处理模块,通常分布在 packages/python-sdk/e2b/ 下的相关协议文件夹中(如用于处理 filesystem 和 process 的相关 _pb2.py 和通信存根代码)。
- MCP 数据模型(Datamodel Codegen 生成):
- Pydantic 数据模型:packages/python-sdk/e2b/sandbox/mcp.py
python sdk 的 代码入口在 packages/python-sdk/e2b/sandbox_sync/main.py:
@classmethod
def create(
cls,
template: Optional[str] = None,
timeout: Optional[int] = None,
metadata: Optional[Dict[str, str]] = None,
envs: Optional[Dict[str, str]] = None,
secure: bool = True,
allow_internet_access: bool = True,
mcp: Optional[McpServer] = None,
network: Optional[SandboxNetworkOpts] = None,
lifecycle: Optional[SandboxLifecycle] = None,
volume_mounts: Optional[SandboxVolumeMount] = None,
**opts: Unpack[ApiParams],
) -> Self:
对应官方实例代码:
from e2b import Sandbox
with Sandbox.create() as sandbox:
result = sandbox.commands.run('echo "Hello from E2B!"')
print(result.stdout) # Hello from E2B!
js sdk
JS 的代码生成主要基于 OpenAPI 规范、Protocol Buffers 以及 JSON Schema 生成 TypeScript 的类型定义文件和接口调用代码:
- API 接口协议代码(OpenAPI 生成):
- 主 API 接口定义:packages/js-sdk/src/api/schema.gen.ts
- 环境 (Envd) API 接口定义:packages/js-sdk/src/envd/schema.gen.ts
- 云盘 (Volume) API 接口定义:packages/js-sdk/src/volume/schema.gen.ts
- 容器内通信协议代码(Buf / gRPC 生成):
- 文件系统通信:packages/js-sdk/src/envd/filesystem/filesystem_connect.ts 和 filesystem_pb.ts
- 进程通信:packages/js-sdk/src/envd/process/process_connect.ts 和 process_pb.ts
- MCP (Model Context Protocol) 规范(JSON Schema 转换):
- 类型声明文件:packages/js-sdk/src/sandbox/mcp.d.ts
js sdk 的 代码入口在 packages/js-sdk/src/sandbox/index.ts
export class Sandbox extends SandboxApi {
static async create<S extends typeof Sandbox>(
this: S,
opts?: SandboxOpts
): Promise<InstanceType<S>>
}
对应官方实例代码:
import Sandbox from 'e2b'
const sandbox = await Sandbox.create()
const result = await sandbox.commands.run('echo "Hello from E2B!"')
console.log(result.stdout) // Hello from E2B!
3 - infra仓库
E2B infra仓库源码学习
3.1 - 构建
E2B infra仓库源码的构建
背景
代码仓库:
https://github.com/e2b-dev/infra
准备工作
clone仓库
mkdir -p ~/work/code/e2b
cd ~/work/code/e2b
git clone git@github.com:e2b-dev/infra.git
cd infra
构建环境
根据 DEV.md 描述,需要基于 Linux(推荐 Ubuntu 22.04+)环境安装基础工具[1][5]。
前置安装:
- Go:核心服务(Orchestrator, API, envd)由 Go 编写,需要 Go 1.22+ 版本。
- Make:统一入口工具
- Docker & Node.js:用于本地基础设施运行和部分前端/脚本编译
- 内核要求:如果要在本地完整跑通虚拟机 Sandbox 构建,Linux 内核推荐 6.8+,并支持 KVM 和 HugePages。
构建
参考代码仓库下的 Makefile 文件:
https://github.com/e2b-dev/E2B/blob/main/Makefile
启动本地构建基础设施
先执行:
make local-infra
启动后要下载一批容器镜像:
make local-infra
cat: .last_used_env: No such file or directory
make -C packages/local-dev local-infra
make[1]: Entering directory '/home/sky/work/code/e2b/infra/packages/local-dev'
USERNAME=clickhouse PASSWORD=clickhouse PORT=9000 \
envsubst < ../clickhouse/local/config.tpl.xml > clickhouse-config-generated.xml
docker compose --file ./docker-compose.yaml up --abort-on-container-failure
[+] Running 107/107
✔ memcached Pulled 239.5s
✔ clickhouse Pulled 994.1s
✔ loki Pulled 84.4s
✔ grafana Pulled 129.6s
✔ mimir Pulled 38.1s
✔ redis Pulled 239.1s
✔ postgres Pulled 273.7s
✔ otel-collector Pulled 99.4s
✔ vector Pulled 52.8s
✔ tempo-init Pulled 144.3s
✔ tempo Pulled 46.4s
可以看到下载的镜像:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
otel/opentelemetry-collector-contrib 0.146.0 ea107e054905 2 months ago 357MB
grafana/mimir 2.17.1 571ecdabe4af 7 months ago 101MB
grafana/tempo 2.8.2 08c4147d7e1e 8 months ago 118MB
memcached 1.6.38 eba955ff6453 9 months ago 87.1MB
clickhouse 25.4.5.24 37d98d845098 11 months ago 682MB
grafana/grafana 12.0.0 29c2d986a9d8 11 months ago 680MB
postgres 17.4 45a04d02adcf 14 months ago 438MB
grafana/loki 3.4.1 6e2b55358175 14 months ago 112MB
redis 7.4.2 65750d044ac8 15 months ago 117MB
timberio/vector 0.34.X-alpine 2710728a77c2 2 years ago 134MB
然后本地运行下列的容器,提供本地构建的各种基础设施:
[+] Running 15/15
✔ Network local-dev_default Cr... 0.0s
✔ Volume local-dev_postgres Cr... 0.0s
✔ Volume local-dev_clickhouse Created 0.0s
✔ Volume local-dev_tempo Creat... 0.0s
✔ Container local-dev-tempo-init-1 Created 0.3s
✔ Container local-dev-clickhouse-1 Created 0.3s
✔ Container local-dev-mimir-1 Created 0.3s
✔ Container local-dev-loki-1 C... 0.3s
✔ Container local-dev-redis-1 Created 0.3s
✔ Container local-dev-otel-collector-1 Created 0.3s
✔ Container local-dev-postgres-1 Created 0.3s
✔ Container memcached Created 0.3s
✔ Container local-dev-grafana-1 Created 0.3s
✔ Container local-dev-tempo-1 Created 0.0s
✔ Container local-dev-vector-1 Created 0.0s
构建核心组件
打开另外一个终端,执行:
make build/api
输出为:
cat: .last_used_env: No such file or directory
make -C packages/api build
make[1]: Entering directory '/home/sky/work/code/e2b/infra/packages/api'
cat: ../../.last_used_env: No such file or directory
# Allow for passing commit sha directly for docker builds
CGO_ENABLED=0 go build -o bin/api -ldflags "-X=main.commitSHA=7e37444a5 -X=main.expectedMigrationTimestamp=20260416120000" .
make[1]: Leaving directory '/home/sky/work/code/e2b/infra/packages/api'
make build/api