Skip to content

[feature] Support docker in docker#392

Open
SJTUyh wants to merge 9 commits into
AISBench:masterfrom
SJTUyh:dk_in_dk
Open

[feature] Support docker in docker#392
SJTUyh wants to merge 9 commits into
AISBench:masterfrom
SJTUyh:dk_in_dk

Conversation

@SJTUyh

@SJTUyh SJTUyh commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

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类型

  • Feature(功能新增)
  • Bugfix(Bug 修复)
  • Docs(文档更新)
  • CI/CD(持续集成/持续部署)
  • Refactor(代码重构)
  • Perf(性能优化)
  • Dependency(依赖项更新)
  • Test-Cases(测试用例更新)
  • Other(其他)

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 测评无法直接运行。

本次变更:

  1. 在全部 4 个镜像(Ubuntu 22.04/24.04、openEuler 22.03/24.03,Python 3.10/3.11/3.12)中预装 Docker Engine 27.3.1 与 Docker Compose v2,让 agent 测评具备开箱即用的 Docker 执行能力。
  2. build_image.sh 构建脚本中加入 Docker / Docker Compose / dockerd 的版本验证,确保镜像中 Docker 安装正确(Docker ≥ 20.0、Compose ≥ 2.0.0)。
  3. 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 直通)

┌────────────────────────── 宿主机 (Host) ──────────────────────────┐
│                                                                  │
│  ┌──────────────────┐                                            │
│  │  Host Kernel     │                                            │
│  └──────────────────┘                                            │
│                                                                  │
│  ┌──────────────────────────────────────────┐  bind mount         │
│  │  Host dockerd                            │  /var/run/docker    │
│  │  /var/run/docker.sock ──────────────────────────┐             │
│  │  (管理宿主自身的容器)                     │       │             │
│  └────────────┬─────────────────────────────┘       │             │
│               │                                     │             │
│               │  实际创建/管理                       │             │
│               ▼                                     │             │
│  ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━┓ │
│  ┃  AISBench Container  (--privileged, 与宿主共享 PID/IPC)   ┃ │
│  ┃                                                            ┃ │
│  ┃   ┌──────────────────────┐                                 ┃ │
│  ┃   │   Docker CLI         │──── HTTP/Unix socket 调用 ─────┘ ┃ │
│  ┃   │   (用户执行)         │  容器内无 dockerd 进程            ┃ │
│  ┃   └──────────────────────┘                                 ┃ │
│  ┃                                                            ┃ │
│  ┃   —— 与宿主共享内核、PID、IPC 命名空间 ——                    ┃ │
│  ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ │
│                                                                  │
│  ┌──────────────────────────────────────────┐                    │
│  │  子容器 (实为宿主上的容器)                │                    │
│  │  ┌────────────────┐                      │                    │
│  │  │ Agent 进程     │  ← 由 Host dockerd   │                    │
│  │  │ OpenBLAS       │    直接创建/回收     │                    │
│  │  │ Python deps    │                      │                    │
│  │  └────────────────┘                      │                    │
│  └──────────────────────────────────────────┘                    │
│                                                                  │
│  ✦ 嵌套子容器出现在宿主 `docker ps` 中                            │
│  ✦ 子容器继承宿主 dockerd 的 seccomp profile                      │
│    (openEuler/RHEL 加固 profile → 触发 clone3 拦截)               │
│  ✦ 宿主 dockerd 重启 → socket inode 失效 → 需 `docker restart`    │
└──────────────────────────────────────────────────────────────────┘

Dockerfile 改动(4 个镜像统一处理)

docker/{ubuntu,openeuler}/Dockerfile.py*.{ubuntu,openeuler}{22.04,24.04,24.03} 的 runtime 阶段末尾追加 Docker 安装步骤:

  • 从华为云 OBS 下载 docker-27.3.1-${ARCH}.tgzdocker-compose-linux-${ARCH}(避免依赖 GitHub / download.docker.com 等海外源)。
  • 解压后把 docker / dockerd / containerd 等二进制放入 /usr/local/bin,把 docker-compose 插件放入 /usr/local/lib/docker/cli-plugins/
  • 安装前置依赖:openEuler 通过 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 --versiondocker compose versiondockerd --versionwhich dockerd,失败则中断构建。
  • 校验输出包含 Docker version / Docker Compose version 关键字(兼容 Docker 27.x 输出格式)。
  • 解析 docker --versiondockerd --version 输出的版本号并确保二者一致,避免 dockerd 被错误替换。
  • 校验 Docker 版本 ≥ 20.0、Docker Compose 版本 ≥ 2.0.0。

docker/OVERVIEW.{zh,en}.md 改动

  • 将原嵌套在「快速开始 / Quick Start」下的「在容器内使用 Docker」整章移出,升级为独立的二级标题 ## 运行 Agent / 沙箱类测评(在容器内使用 Docker) / ## Running Agent / Sandbox Benchmarks (Docker Inside the Container),并在入口处给出明显的「仅 agent 测评需要」提示。
  • 新增章节内容:
    • Mode A — Socket Passthrough:宿主 socket 直通,HOST_PATH 软链策略,使用 --use-pep517 --no-deps --no-build-isolation --break-system-packages 重新链接 ais_bench。
    • Mode B — Docker-in-Docker:宿主前置检查(docker versionuname -rstat -fc %T /sys/fs/cgroup)、daemon.json 强制 cgroupfs driver + vfs storage、--cgroupns=host 必要性说明。
    • 两种模式通用:运行容器工作负载示例(docker pull / docker run / docker compose up)。
    • 模式选择指引:什么时候选 A / 什么时候选 B。
    • --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 镜像的本地构建。
image
  • 使用 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的测试:

img_v3_02137_cde33507-71a0-43a5-bb7f-c0bd9144769g

⚠️ BC-breaking (Optional) / 向后不兼容变更(可选)

  • Dockerfile.py310.openeuler22.03Dockerfile.py312.ubuntu24.04 的镜像层增加了约 100MB(Docker 二进制 + Compose 插件)。如果现有用户基于这两个旧镜像做了二次封装,需要重新拉取新镜像。
  • 新版镜像的 runtime 阶段已经预设了 /usr/local/bin/{docker,dockerd,containerd,...} 等可执行文件,如果用户脚本中存在同名文件冲突,需要排查。

⚠️ Performance degradation (Optional) / 性能下降(可选)

无。Docker 安装只发生在构建阶段,对运行时(推理 / 评测启动)性能无影响。Agent 测评场景下,Mode A 直接复用宿主 daemon,不引入额外性能开销。

🌟 Use cases (Optional) / 使用案例(可选)

  1. terminal-bench 2:用户希望基于 AISBench 跑 terminal-bench 2 任务,需要容器内具备 Docker 以启动任务沙箱。
  2. SWE-Bench:用户希望跑 SWE-Bench 评测,需要在隔离沙箱中执行测试。
  3. 自定义 agent 测评:用户在容器内手动 docker run 一些工具型容器,与宿主机 Docker daemon 共享执行环境(Mode A)。

✅ Checklist / 检查列表

Before PR:

  • 已在本地完成 openEuler 22.03 + Ubuntu 24.04 镜像构建,build_image.sh 验证步骤通过。
  • OVERVIEW 文档中英文版本保持一致。
  • 所有变更均围绕「Docker 安装 + Docker 使用文档」展开,未涉及核心评测逻辑。

After PR:

  • 已在本地模拟 Mode A / Mode B 启动流程,验证文档可操作。
  • 建议在 CI 中增加镜像构建 → 启动容器 → docker run --rm hello-world 的端到端冒烟测试。

👥 Collaboration Info / 协作信息

  • Suggested Reviewers / 建议审核人: @AISBench/benchmark-maintainers
  • Relevant Module Owners / 相关模块负责人: 镜像与构建脚本负责人
  • Other Collaboration Notes / 其他协作说明:本次改动只涉及 docker/ 目录,未触碰 ais_bench/ 业务代码,agent 测评脚本(如 harbor / terminal-bench 适配)无需同步更新。

🌟 Useful CI Command / 实用的CI命令

Command / 命令 Introduction / 介绍
/gemini review Performs a code review for the current pull request in its current state by Gemini. / 对当前拉取请求在当前状态下由 Gemini 执行代码审核。
/gemini summary Provides a summary of the current pull request in its current state by Gemini. / 对当前拉取请求在当前状态下由 Gemini 提供摘要。
/gemini help Displays a list of available commands of Gemini. / 显示 Gemini 可用命令的列表。
/readthedocs build Triggers a build of the documentation for the current pull request in its current state by Read the Docs. / 触发当前拉取请求在当前状态下由 Read the Docs 构建文档。

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread docker/build_image.sh
fi

# dockerd 二进制存在性二次校验(Docker 27.x 输出与 docker --version 同格式,需确保调用的是 dockerd 而非 docker)
dockerd_which_output=$(docker run --rm ${image_name} which dockerd 2>&1)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

在极简的 Ubuntu 或 openEuler 基础镜像中,默认可能没有安装 which 命令。这会导致 docker run --rm ${image_name} which dockerd 执行失败(返回退出码 127),从而使构建脚本误判为未找到 dockerd 并中断构建。\n\n建议使用 Shell 内置的 command -v 命令来代替 which,它不仅是 POSIX 标准的,而且不需要镜像中额外安装 which 工具,更加健壮。

Suggested change
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)

Comment on lines +128 to +131
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 && \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

虽然通过将 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 && \

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AISBench本身不涉及 docker-compose这种老版本的使用

Comment on lines +120 to +123
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 && \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

虽然通过将 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 && \

Comment on lines +164 to +167
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 && \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

虽然通过将 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 && \

Comment on lines +162 to +165
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 && \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

虽然通过将 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 && \

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant