跳转到内容

沙箱镜像定制

自定义 blade-agent 的 sandbox 运行环境镜像。操作前自动备份当前镜像为 :bak 标签,构建完成后覆盖回原镜像名,确保可随时回滚。

Terminal window
# 1. 读取当前使用的镜像名
grep SANDBOX_IMAGE /home/ai/codes/blade-agent/.env
# 2. 查看本地已有的 sandbox 镜像
docker images | grep sandbox

将读取到的镜像全名(含 registry 和 tag)记为 $SANDBOX_IMAGE

必须先备份,再做任何修改。

Terminal window
docker tag $SANDBOX_IMAGE ${SANDBOX_IMAGE%:*}:bak

验证备份:

Terminal window
docker images | grep sandbox | grep bak

适合少量包安装、快速调试。

非交互模式(推荐):

Terminal window
# 一步完成:启动容器 → 安装 → 提交 → 清理
docker run --name sandbox-customize ${SANDBOX_IMAGE%:*}:bak \
/bin/bash -c "pip install package1 package2 && apt-get update && apt-get install -y tool1"
docker commit sandbox-customize $SANDBOX_IMAGE
docker rm sandbox-customize

交互模式:

Terminal window
docker run -it --name sandbox-customize ${SANDBOX_IMAGE%:*}:bak /bin/bash
# 在容器内执行安装操作,退出后:
docker commit sandbox-customize $SANDBOX_IMAGE
docker rm sandbox-customize

适合复杂定制、需要可复现的构建记录。

Terminal window
mkdir -p /tmp/sandbox-custom

编写 /tmp/sandbox-custom/Dockerfile

ARG BAK_IMAGE
FROM ${BAK_IMAGE}
# 安装 Python 包
RUN pip install --no-cache-dir package1 package2
# 安装系统工具
RUN apt-get update && apt-get install -y --no-install-recommends \
some-tool \
&& rm -rf /var/lib/apt/lists/*
# 保持原始启动命令
CMD ["sleep", "infinity"]

构建:

Terminal window
docker build \
--build-arg BAK_IMAGE=${SANDBOX_IMAGE%:*}:bak \
-t $SANDBOX_IMAGE \
/tmp/sandbox-custom
Terminal window
# 确认镜像已更新
docker images | grep sandbox
# 验证安装结果
docker run --rm $SANDBOX_IMAGE python -c "import package1; print('OK')"
docker run --rm $SANDBOX_IMAGE which some-tool
Terminal window
docker tag ${SANDBOX_IMAGE%:*}:bak $SANDBOX_IMAGE

沙箱内可配置 Nexus 私有源用于安装内部包:

Terminal window
# Nexus 地址
http://<host>:30021

在 blade-agent 的 .env 中配置沙箱使用的包源:

Terminal window
SANDBOX_PIP_INDEX_URL=http://<host>:30021/repository/pypi-proxy/simple/
SANDBOX_NPM_CONFIG_REGISTRY=http://<host>:30021/repository/npm-proxy/

每个用户的文件存储在宿主机的固定路径下,沙箱容器启动时会自动挂载:

/opt/box/files/users/{user_id}/

该目录用于存放用户上传的文件和工作区数据。沙箱内可通过 /home/user/files/ 访问挂载的用户文件。

  • 备份镜像(:bak)在确认新镜像稳定前不要删除
  • 新镜像不影响已有容器,只有新创建的容器才会使用
  • 方式 A 的 commit 不保留构建记录,方式 B 更适合需要复现的场景
  • 大量包安装建议用方式 B,可利用 Docker 层缓存
  • 镜像内默认 pip 源是清华镜像(PIP_INDEX_URL 已配置),无需额外指定