开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

E2B沙箱服务部署

建议使用openEuler 24.03 LTS SP3 for Arm原生的内核,若更新内核会在E2B构建模板阶段可能会出现未知问题。

E2B服务部署

可参考以下步骤,通过提供的脚本完成自动化部署;若需定制化调整,可基于脚本内容进行修改。

  1. 安装e2b-infra软件包。
    1. 获取软件包。软件链接如下,下载arm64版本。
      https://eulermaker.openeuler.openatom.cn/package/download?osProject=2403sp3&packageName=e2b-infra
    2. 卸载旧的软件包。
      rpm -e e2b-infra
    3. 安装e2b-infra软件包,安装目录为“/opt/e2b-infra”
      rpm -ivh e2b-infra-2026.09-3.oe2403sp3.aarch64.rpm
  2. 修改“/opt/e2b-infra/dep/.env”配置文件。
    1. 打开配置文件。
      vi /opt/e2b-infra/dep/.env
    2. 按“i”进入编辑模式,修改如下配置。
      # 在.env文件第一行
      export SERVER_IP=本机地址                                  # 当前集群server节点的IP地址,空格分隔(server节点为nomad的server端运行所在的节点)
      export DEPLOY_MODE=k8s                                     # 当前支持k8s和nomad两种部署方式

      .env文件中其余关键配置默认如下,可按需修改。

      export HARBOR_HTTP_PORT=2900 # harbor仓库地址,默认值为 REGISTRY_URL=$SERVER_IP:2900/e2b-orchestration,即harbor默认端口为2900
      export HARBOR_HTTP_PORT=30443 
      export REGISTRY_PROJECT=e2b-orchestration #harbor默认项目
      export POSTGRES_CONNECTION_STRING="postgresql://{username}:{password}@{ip}:{port}/{database_name}?sslmode=disable"  # postgres数据库地址,默认值为postgresql://postgres:local@$SERVER_IP:5432/mydatabase?sslmode=disable
    3. 按“Esc”键退出编辑模式,输入:wq!,按“Enter”键保存并退出文件。
  3. 将nerdctl兼容为docker命令。
    cp -f /usr/bin/nerdctl /usr/bin/docker
  4. 安装容器镜像构建引擎BuildKit。
    1. 根据系统架构,设置BuildKit下载架构。
      case "$(uname -m)" in
      x86_64)
        ARCH=amd64
        ;;
      aarch64*)
        ARCH=arm64
        ;;
      *)
        echo "$(uname -m), isn't supported"
        exit 1
        ;;
      esac
    2. 下载BuildKit安装包。
      wget https://openfuyao.obs.cn-north-4.myhuaweicloud.com/moby/buildkit/releases/download/v0.27.1/buildkit-v0.27.1.linux-${ARCH}.tar.gz
    3. 解压并安装BuildKit。
      tar -xvzf buildkit-v0.27.1.linux-${ARCH}.tar.gz -C /usr/local/bin/
      mv /usr/local/bin/bin/buildctl /usr/local/bin/bin/buildkitd /usr/local/bin/
    4. 创建BuildKit配置文件“/etc/buildkit/buildkitd.toml”
      mkdir -p /etc/buildkit
      cat > /etc/buildkit/buildkitd.toml <<'EOF'
      [worker.oci]
        enabled = false
      
      [worker.containerd]
        namespace = "default"
        address = "/run/containerd/containerd.sock"
      EOF
    5. 配置BuildKit systemd服务。
      cat > /usr/lib/systemd/system/buildkit.service << 'EOF'
      [Unit]
      Description=BuildKit
      Requires=buildkit.socket
      After=buildkit.socket
      Documentation=https://github.com/moby/buildkit 
      
      [Service]
      Type=notify
      ExecStart=/usr/local/bin/buildkitd --addr fd://
      
      [Install]
      WantedBy=multi-user.target
      EOF
    6. 配置BuildKit Socket。
      cat > /usr/lib/systemd/system/buildkit.socket << 'EOF'
      [Unit]
      Description=BuildKit
      Documentation=https://github.com/moby/buildkit
      
      [Socket]
      ListenStream=%t/buildkit/buildkitd.sock
      SocketMode=0660
      
      [Install]
      WantedBy=sockets.target
      EOF
    7. 启动BuildKit服务。
      systemctl enable --now buildkit.service  buildkit.socket
  5. 安装并启动。
    1. 进入“/opt/e2b-infra”目录。
      cd /opt/e2b-infra
    2. 下载依赖组件。如遇网络问题可手动下载相关依赖并上传至“/opt/e2b-infra/dep”目录。
      bash build.sh --download

      arm64所需依赖包如下所示(详见/opt/e2b-infra/build.sh脚本download_packages函数)。

    3. 安装。安装过程需要拉取Docker镜像,如遇网络问题可使用Docker代理进行手动拉取。在执行start启动服务之前需将Docker代理关掉。
      bash build.sh --install

      Docker镜像需要如下所示(详见build.sh脚本pull_docker_images函数)。

    4. 启动服务。
      bash build.sh --start

      如启动失败,则先执行--stop并且--uninstall,再尝试重新--start启动服务。

      bash build.sh --stop 
      bash build.sh --uninstall
      表1 build.sh默认配置参数说明

      变量名

      含义

      PG_PORT

      5432

      postgres容器服务端口。

      HARBOR_HTTP_PORT

      2900

      harbor服务端口,后续可通过server_ip:2900访问harbor管理系统。

      HARBOR_USER

      admin

      harbor管理系统账户。

      HARBOR_PASSWORD

      Harbor12345

      harbor管理系统账户admin的默认密码。

  6. 验证E2B,使用OpenClaw调用沙箱执行命令。
    1. 导入Ubuntu镜像。
      cd /opt/e2b-infra/dep
      docker load < ubuntu-22.04-custom.tar.gz
    2. 用户可以使用自定义镜像创建模板,默认使用Ubuntu镜像,执行以下命令,将“ip”替换为服务器IP地址,将Ubuntu镜像推送到harbor镜像仓。
      docker tag ubuntu:22.04-custom  {ip}:30443/e2b-orchestration/ubuntu:22.04-custom
      docker push  {ip}:30443/e2b-orchestration/ubuntu:22.04-custom
    3. 创建沙箱模板,修改“/opt/e2b-infra/template-ubuntu.py”文件里的SERVER_IP为本机IP地址。
      cd /opt/e2b-infra
      python3 template-ubuntu.py

      “/opt/e2b-infra/template-ubuntu.py”中Template.build的alias参数为模板别名,cpu_count为沙箱vCPU数,memory_mb为沙箱内存大小(单位MB)。

      结果如下,打印模板构建完成。

    4. 创建沙箱,验证服务是否部署成功,修改“/opt/e2b-infra/create_sandbox.py”里“ip”为本机IP地址。
      cd /opt/e2b-infra
      python3 create_sandbox.py

      预期结果为输出沙箱ID。

    5. 在OpenClaw容器内部署E2B插件。
      bash build.sh --deploy-plugin openclaw openclaw app=openclaw-deployment default

      bash build.sh --deploy-plugin openclaw <模板名称> <选择器> <k8s命名空间>

      参数说明:

      • openclaw:固定为“openclaw”。
      • <模板名称>:E2B创建的模板名称,默认"openclaw"。
      • <选择器>:OpenClaw容器的label-selector,可通过kubectl describe pod -n default {openclaw容器名} | grep app=获取。
      • <k8s命名空间>:OpenClaw容器的命名空间,默认default。

      执行结果如下。

    6. 验证OpenClaw调用e2b沙箱执行Shell命令的能力。
      kubectl exec -it <pod名称> -- bash
      openclaw tui

      执行openclaw tui命令后,向OpenClaw发送对话消息“使用exec-local执行uname -a”,执行结果如下。

    7. (可选)若容器重启需重新配置网络。

      进入容器。

      kubectl exec -it <pod名称> -- bash
      配置网络。
      cat > /etc/dnsmasq.conf << 'EOF'
      no-resolv
      address=/.e2b.app/127.0.0.1
      listen-address=127.0.0.1
      bind-interfaces
      EOF
      pkill dnsmasq 2>/dev/null || true
      yum install -y dnsmasq socat
      dnsmasq --conf-file=/etc/dnsmasq.conf
      #E2B_ENVD_PORT默认3002
      nohup socat TCP-LISTEN:80,fork,reuseaddr TCP:${E2B_HOST_IP}:${E2B_ENVD_PORT} >/dev/null 2>&1 &
      nohup socat TCP-LISTEN:443,fork,reuseaddr TCP:${E2B_HOST_IP}:${E2B_ENVD_PORT} >/dev/null 2>&1 &