镜像构建

E2B 基础镜像构建

准备工作

编译 envd 二进制

在本地宿主机(linux)上克隆并编译 envd:

# 回到 base 的上级目录
cd /home/sky/work/code/e2b/envd-image-builder

# 克隆官方 infra 仓库(如果慢可以换 github 镜像源)
git clone https://github.com/e2b-dev/infra.git

# 进入 envd 目录
cd infra/packages/envd

# 静态编译出 Linux x64 的二进制文件
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o ../../../base/envd main.go

代码定制

修改默认 host IP

https://deepwiki.com/search/envd-host-ip-169254021_afda741e-0447-47c8-b19d-a63e1c3fa86a?mode=fast

envd 默认使用的 host IP 是 169.254.0.21 ,通过硬编码的方式配置,代码在 packages/envd/internal/port/forward.go

var defaultGatewayIP = net.IPv4(169, 254, 0, 21)

移植到其他环境之后,如果需要修改这个 host IP,比如修改为其他固定值,可以简单修改这行代码。

如果是移植到 k8s 下,sandbox 运行在 pod 中,这里的 host IP 就不是固定值,而是所在 pod 的被分配的 IP 地址。则需要修改 envd 代码,通过某种方式传入 pod IP。

TODO:看怎么修改代码合适。

base 镜像

构建 base 镜像

base 镜像的 Dockerfile:

FROM debian:bookworm-slim

ENV DEBIAN_FRONTEND=noninteractive

# 安装基础系统工具
RUN apt-get update && apt-get install -y --no-install-recommends \
    bash ca-certificates curl git openssh-client procps sudo unzip wget \
    && rm -rf /var/lib/apt/lists/*

# 创建用于 AI 执行代码的普通隔离用户(让 envd 拥有 root 权限,但 AI 执行代码时可以用这个低权限用户)
RUN useradd -m -s /bin/bash sandboxuser && \
    echo "sandboxuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

# 直接把我们在本地编译好的 envd 复制进去
COPY envd /usr/local/bin/envd

# 显式指定工作目录并保持以 ROOT 用户身份运行
WORKDIR /root
USER root

# 暴露官方标准的 49983 端口
EXPOSE 49983

ENTRYPOINT ["/usr/local/bin/envd"]

# 生产默认配置:开启 49983 端口,非纯 Firecracker 兼容模式,开启详细日志
CMD ["-port", "49983", "-isnotfc", "-verbose"]

构建镜像:

docker build -t e2b-base:latest .

查看本地构建好的 e2b-base 镜像:

$ docker images                    

IMAGE                                          ID             DISK USAGE   CONTENT SIZE   EXTRA 
e2b-base:latest                                28d8689e05f8        289MB         72.9MB    U   

启动 base 镜像

直接在本机用 docker 启动上面构建好的 e2b base 镜像:

docker run -d \
  --name e2b-base-test \
  --privileged \
  -p 49983:49983 \
  e2b-base:latest

使用完成之后,或者更新代码后重新构建重新运行,关闭已经运行的容器:

docker rm -f e2b-base-test

code interpreter 镜像

TODO