[feature] Support docker in docker#392
Conversation
There was a problem hiding this comment.
Code Review
This pull request introduces support for running agent and sandbox benchmarks by installing Docker Engine and Docker Compose v2 inside the Docker images (Ubuntu and openEuler). It also adds comprehensive documentation for Socket Passthrough and Docker-in-Docker modes, and updates the build script to validate the installed Docker versions. The review feedback recommends replacing the which command with command -v in the build script to ensure compatibility with minimal images, and adding a symbolic link for docker-compose in the Dockerfiles to maintain backward compatibility with legacy scripts.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| fi | ||
|
|
||
| # dockerd 二进制存在性二次校验(Docker 27.x 输出与 docker --version 同格式,需确保调用的是 dockerd 而非 docker) | ||
| dockerd_which_output=$(docker run --rm ${image_name} which dockerd 2>&1) |
There was a problem hiding this comment.
在极简的 Ubuntu 或 openEuler 基础镜像中,默认可能没有安装 which 命令。这会导致 docker run --rm ${image_name} which dockerd 执行失败(返回退出码 127),从而使构建脚本误判为未找到 dockerd 并中断构建。\n\n建议使用 Shell 内置的 command -v 命令来代替 which,它不仅是 POSIX 标准的,而且不需要镜像中额外安装 which 工具,更加健壮。
| dockerd_which_output=$(docker run --rm ${image_name} which dockerd 2>&1) | |
| dockerd_which_output=$(docker run --rm ${image_name} bash -c "command -v dockerd" 2>&1) |
| mkdir -p /usr/local/lib/docker/cli-plugins && \ | ||
| curl -fsSL "https://aisbench.obs.cn-north-4.myhuaweicloud.com/images/resources/docker-compose-linux-${ARCH}" \ | ||
| -o /usr/local/lib/docker/cli-plugins/docker-compose && \ | ||
| chmod +x /usr/local/lib/docker/cli-plugins/docker-compose && \ |
There was a problem hiding this comment.
虽然通过将 docker-compose 放入 /usr/local/lib/docker/cli-plugins/ 成功启用了 docker compose(插件形式),但许多存量脚本或第三方工具仍会直接调用 docker-compose(带连字符的独立命令)。\n\n建议在 /usr/local/bin/docker-compose 创建一个指向该插件的软链接,以保证向下兼容性,避免破坏用户现有的自动化脚本。
mkdir -p /usr/local/lib/docker/cli-plugins && \
curl -fsSL "https://aisbench.obs.cn-north-4.myhuaweicloud.com/images/resources/docker-compose-linux-${ARCH}" \
-o /usr/local/lib/docker/cli-plugins/docker-compose && \
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose && \
ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose && \
There was a problem hiding this comment.
AISBench本身不涉及 docker-compose这种老版本的使用
| mkdir -p /usr/local/lib/docker/cli-plugins && \ | ||
| curl -fsSL "https://aisbench.obs.cn-north-4.myhuaweicloud.com/images/resources/docker-compose-linux-${ARCH}" \ | ||
| -o /usr/local/lib/docker/cli-plugins/docker-compose && \ | ||
| chmod +x /usr/local/lib/docker/cli-plugins/docker-compose && \ |
There was a problem hiding this comment.
虽然通过将 docker-compose 放入 /usr/local/lib/docker/cli-plugins/ 成功启用了 docker compose(插件形式),但许多存量脚本或第三方工具仍会直接调用 docker-compose(带连字符的独立命令)。\n\n建议在 /usr/local/bin/docker-compose 创建一个指向该插件的软链接,以保证向下兼容性,避免破坏用户现有的自动化脚本。
mkdir -p /usr/local/lib/docker/cli-plugins && \
curl -fsSL "https://aisbench.obs.cn-north-4.myhuaweicloud.com/images/resources/docker-compose-linux-${ARCH}" \
-o /usr/local/lib/docker/cli-plugins/docker-compose && \
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose && \
ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose && \
| mkdir -p /usr/local/lib/docker/cli-plugins && \ | ||
| curl -fsSL "https://aisbench.obs.cn-north-4.myhuaweicloud.com/images/resources/docker-compose-linux-${ARCH}" \ | ||
| -o /usr/local/lib/docker/cli-plugins/docker-compose && \ | ||
| chmod +x /usr/local/lib/docker/cli-plugins/docker-compose && \ |
There was a problem hiding this comment.
虽然通过将 docker-compose 放入 /usr/local/lib/docker/cli-plugins/ 成功启用了 docker compose(插件形式),但许多存量脚本或第三方工具仍会直接调用 docker-compose(带连字符的独立命令)。\n\n建议在 /usr/local/bin/docker-compose 创建一个指向该插件的软链接,以保证向下兼容性,避免破坏用户现有的自动化脚本。
mkdir -p /usr/local/lib/docker/cli-plugins && \
curl -fsSL "https://aisbench.obs.cn-north-4.myhuaweicloud.com/images/resources/docker-compose-linux-${ARCH}" \
-o /usr/local/lib/docker/cli-plugins/docker-compose && \
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose && \
ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose && \
| mkdir -p /usr/local/lib/docker/cli-plugins && \ | ||
| curl -fsSL "https://aisbench.obs.cn-north-4.myhuaweicloud.com/images/resources/docker-compose-linux-${ARCH}" \ | ||
| -o /usr/local/lib/docker/cli-plugins/docker-compose && \ | ||
| chmod +x /usr/local/lib/docker/cli-plugins/docker-compose && \ |
There was a problem hiding this comment.
虽然通过将 docker-compose 放入 /usr/local/lib/docker/cli-plugins/ 成功启用了 docker compose(插件形式),但许多存量脚本或第三方工具仍会直接调用 docker-compose(带连字符的独立命令)。\n\n建议在 /usr/local/bin/docker-compose 创建一个指向该插件的软链接,以保证向下兼容性,避免破坏用户现有的自动化脚本。
mkdir -p /usr/local/lib/docker/cli-plugins && \
curl -fsSL "https://aisbench.obs.cn-north-4.myhuaweicloud.com/images/resources/docker-compose-linux-${ARCH}" \
-o /usr/local/lib/docker/cli-plugins/docker-compose && \
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose && \
ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose && \
Thanks for your contribution; we appreciate it a lot. The following instructions will make your pull request healthier and help you get feedback more easily. If you do not understand some items, don't worry, just make the pull request and seek help from maintainers.
感谢您的贡献,我们非常重视。以下说明将使您的拉取请求更健康,更易于获得反馈。如果您不理解某些项目,请不要担心,只需提交拉取请求并从维护人员那里寻求帮助即可。
PR Type / PR类型
Related Issue | 关联 Issue
Fixes #(issue ID / issue 编号) / Relates to #(issue ID / issue 编号)
Relates #390
🔍 Motivation / 变更动机
AISBench Benchmark 镜像目前定位于「服务化模型评测」,但 terminal-bench 2、SWE-Bench 等 agent 类测评要求在隔离沙箱中运行子任务,本质上需要在测评容器内部再启动 Docker 容器。原镜像没有 Docker 执行环境,agent 测评无法直接运行。
本次变更:
build_image.sh构建脚本中加入 Docker / Docker Compose / dockerd 的版本验证,确保镜像中 Docker 安装正确(Docker ≥ 20.0、Compose ≥ 2.0.0)。OVERVIEW.zh.md/OVERVIEW.en.md中新增「在容器内使用 Docker」章节,区分 Mode A(Socket 代理,兼容任意 Docker 版本) 与 Mode B(Docker-in-Docker,需宿主 Docker ≥ 20.10 + cgroup v2) 两种部署模式,并补充--privileged的安全风险说明。📝 Modification / 修改内容
两种docker in docker 实现方式:
模式 A:Docker-in-Docker(真嵌套,inner dockerd)
┌────────────────────────── 宿主机 (Host) ──────────────────────────┐ │ │ │ ┌──────────────────┐ ┌──────────────────────────┐ │ │ │ Host Kernel │ │ Host dockerd │ │ │ │ (cgroup v2) │◀───────▶│ /var/run/docker.sock │ │ │ └──────────────────┘ │ 管理宿主自身的容器 │ │ │ └──────────────────────────┘ │ │ │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │ ┃ AISBench Container (--privileged --cgroupns=host) ┃ │ │ ┃ ┃ │ │ ┃ ┌──────────────────────┐ ┌──────────────────────┐ ┃ │ │ ┃ │ Docker CLI │────▶│ Inner dockerd │ ┃ │ │ ┃ │ (用户执行) │ │ (容器内独立进程) │ ┃ │ │ ┃ └──────────────────────┘ │ daemon.json: │ ┃ │ │ ┃ │ native.cgroupdriver │ ┃ │ │ ┃ │ =cgroupfs │ ┃ │ │ ┃ │ storage=vfs │ ┃ │ │ ┃ └──────────┬───────────┘ ┃ │ │ ┃ │ spawn ┃ │ │ ┃ ▼ ┃ │ │ ┃ ┌──────────────────────┐ ┃ │ │ ┃ │ containerd │ ┃ │ │ ┃ │ (内嵌在 inner d) │ ┃ │ │ ┃ └──────────┬───────────┘ ┃ │ │ ┃ │ ┃ │ │ ┃ ▼ ┃ │ │ ┃ ┌──────────────────────┐ ┃ │ │ ┃ │ 嵌套子容器 │ ┃ │ │ ┃ │ (真隔离命名空间) │ ┃ │ │ ┃ │ ┌────────────────┐ │ ┃ │ │ ┃ │ │ Agent 进程 │ │ ┃ │ │ ┃ │ │ OpenBLAS │ │ ┃ │ │ ┃ │ │ Python deps │ │ ┃ │ │ ┃ │ └────────────────┘ │ ┃ │ │ ┃ └──────────────────────┘ ┃ │ │ ┃ ┃ │ │ ┃ —— 隔离边界:独立 PID/IPC/Net/Mount/User 命名空间 —— ┃ │ │ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ │ │ │ │ ✦ 嵌套子容器不出现在宿主 `docker ps` 中 │ │ ✦ 子容器继承 Docker 官方默认 seccomp profile(无 clone3 拦截) │ │ ✦ 宿主 dockerd 重启不会影响 inner dockerd │ └──────────────────────────────────────────────────────────────────┘模式 B:Socket 代理(容器内无 daemon,socket 直通)
Dockerfile 改动(4 个镜像统一处理)
在
docker/{ubuntu,openeuler}/Dockerfile.py*.{ubuntu,openeuler}{22.04,24.04,24.03}的 runtime 阶段末尾追加 Docker 安装步骤:docker-27.3.1-${ARCH}.tgz与docker-compose-linux-${ARCH}(避免依赖 GitHub / download.docker.com 等海外源)。docker/dockerd/containerd等二进制放入/usr/local/bin,把docker-compose插件放入/usr/local/lib/docker/cli-plugins/。dnf install -y iptables curl;Ubuntu 通过apt-get install -y --no-install-recommends iptables(curl 已在 runtime 阶段预装)。docker --version/docker compose version/dockerd --version命令可用。docker/build_image.sh改动镜像构建成功后追加 Docker 基本命令验证流程:
docker --version、docker compose version、dockerd --version、which dockerd,失败则中断构建。Docker version/Docker Compose version关键字(兼容 Docker 27.x 输出格式)。docker --version与dockerd --version输出的版本号并确保二者一致,避免 dockerd 被错误替换。docker/OVERVIEW.{zh,en}.md改动## 运行 Agent / 沙箱类测评(在容器内使用 Docker)/## Running Agent / Sandbox Benchmarks (Docker Inside the Container),并在入口处给出明显的「仅 agent 测评需要」提示。HOST_PATH软链策略,使用--use-pep517 --no-deps --no-build-isolation --break-system-packages重新链接 ais_bench。docker version、uname -r、stat -fc %T /sys/fs/cgroup)、daemon.json强制cgroupfsdriver +vfsstorage、--cgroupns=host必要性说明。docker pull/docker run/docker compose up)。--privileged安全说明:capability / seccomp / AppArmor / 设备访问 / cgroup 写权限 / 内核模块加载风险,以及 Sysbox、Rootless Docker 等替代方案。📐 Associated Test Results / 关联测试结果
bash docker/build_image.sh --tag test-docker-in-dk --os openeuler22.03 --py-version py310完成 openEuler 22.03 + Python 3.10 镜像的本地构建,并跑通docker --version/docker compose version/dockerd --version三个验证步骤。bash docker/build_image.sh --tag test-docker-in-dk --os ubuntu24.04 --py-version py312完成 Ubuntu 24.04 + Python 3.12 镜像的本地构建。使用 Mode A 启动容器后成功执行
docker run --rm alpine:latest echo "Hello from a nested container"。已按 OVERVIEW 文档实操 Mode A 的
HOST_PATH+pip3 install -e ./ --use-pep517 --no-deps --no-build-isolation --break-system-packages重新链接流程,能正常加载 ais_bench。用Mode A & Mode B均完成了terminal bench 2的测试:
Dockerfile.py310.openeuler22.03与Dockerfile.py312.ubuntu24.04的镜像层增加了约 100MB(Docker 二进制 + Compose 插件)。如果现有用户基于这两个旧镜像做了二次封装,需要重新拉取新镜像。/usr/local/bin/{docker,dockerd,containerd,...}等可执行文件,如果用户脚本中存在同名文件冲突,需要排查。无。Docker 安装只发生在构建阶段,对运行时(推理 / 评测启动)性能无影响。Agent 测评场景下,Mode A 直接复用宿主 daemon,不引入额外性能开销。
🌟 Use cases (Optional) / 使用案例(可选)
docker run一些工具型容器,与宿主机 Docker daemon 共享执行环境(Mode A)。✅ Checklist / 检查列表
Before PR:
build_image.sh验证步骤通过。After PR:
docker run --rm hello-world的端到端冒烟测试。👥 Collaboration Info / 协作信息
docker/目录,未触碰ais_bench/业务代码,agent 测评脚本(如 harbor / terminal-bench 适配)无需同步更新。🌟 Useful CI Command / 实用的CI命令
/gemini review/gemini summary/gemini help/readthedocs build