Pull Request已成功合入, 合并人@张雅晴
(感谢 陈卉 的贡献)变更摘要
此 PR 旨在支持在部署工具(deploy tool)中启动 agent-runtime,核心是重构 docker/Dockerfile.agent-runtime 的镜像构建方式:将基础镜像由固定的 python:3.11-slim 改为通过 BASE_IMAGE 参数动态指定,并新增 PIP_EXTRA_ARGS 供构建时附加 pip 参数;构建流程从基于 uv sync --frozen --extra server --no-dev 切换为对 foundation、service、applications/agent_runtime[server] 的 pip install -e editable 安装;容器内改用新建的 app 用户运行,并取消原 ENTRYPOINT,改为以 CMD ["agent-runtime", "--mode", "server"] 直接启动服务。
主要改动
- 基础镜像参数化: 将固定
FROM python:3.11-slim改为ARG BASE_IMAGE+FROM ${BASE_IMAGE},并新增ARG PIP_EXTRA_ARGS以支持构建时按部署环境指定镜像与额外 pip 参数。 - 构建方式改为 pip editable 安装: 移除基于
uv的uv sync --frozen --extra server --no-dev流程及相关UV_PROJECT_ENVIRONMENT、UV_LINK_MODE环境变量,改为pip install -e安装./foundation、./service与./applications/agent_runtime[server]。 - 目录布局与运行用户调整: 构建上下文改为整体
COPY .到/app/agent-runtime并chown该目录,新建app用户,WORKDIR设为/app/agent-runtime,PATH追加/home/app/.local/bin以定位安装后的可执行文件。 - 启动命令调整: 删除原
ENTRYPOINT ["/opt/venv/bin/agent-runtime", "--mode", "server"],改为CMD ["agent-runtime", "--mode", "server"]作为容器默认启动命令,端口EXPOSE 8091保持不变。


欢迎来到 openJiuwen 社区
Hey @chen-hui-zhe-xi , 感谢你对社区的贡献.
机器人使用手册
有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。


代码审查
我已完成对 docker/Dockerfile.agent-runtime 这一唯一变更文件的逐行审查。由于审查范围被限制在该文件及其父目录内,我无法直接读取仓库根目录的 .dockerignore、logging.yaml 等文件来交叉确认,相关结论已在 confidence 中如实反映。
关闭总结
变更文件核查:
docker/Dockerfile.agent-runtime— 已审查,发现 6 个问题。
发现统计(按优先级):
- P2:4 个
- 移除预建
logs/目录,框架日志dictConfig可能启动失败(第 10 行,confidence 0.55) - 移除
PYTHONUNBUFFERED=1,容器日志被缓冲、可能丢失(第 20 行,confidence 0.75) COPY . /app/agent-runtime/全量拷贝构建上下文,存在把密钥/.git烘焙进镜像的风险(第 9 行,confidence 0.50)CMD依赖 PATH 解析agent-runtime,而BASE_IMAGE变为外部可变量,非标准 python 基础镜像下可能启动即失败(第 23 行,confidence 0.70)
- 移除预建
- P3:2 个
- 用未固定版本的
pip install -e取代uv --frozen锁定解析,镜像构建不可复现(第 12–16 行,confidence 0.45) useradd未固定 uid,与旧镜像appuser(uid 1000)约定不一致(第 6 行,confidence 0.40)
- 用未固定版本的
总体风险评估:
本次变更将镜像构建从“固定 python:3.11-slim + uv 锁定解析 + 定向 COPY”整体改造为“外部可控 BASE_IMAGE + 未锁定 pip + 全量 COPY”,并简化了启动命令。核心风险集中在三类:一是日志与启动可靠性回退(logs/ 预建与 PYTHONUNBUFFERED 被移除,可能导致启动崩溃或日志不可观测);二是安全与镜像卫生(COPY . 无 .dockerignore 兜底,可能把密钥/.git 打进镜像);三是可复现性与启动契约弱化(依赖不再锁定、命令依赖 PATH 解析而基础镜像变为外部变量)。这些均属本 PR 直接引入的行为回退,建议在合入前逐项确认,尤其需确认 deploy 工具传入的 BASE_IMAGE 契约与仓库根 .dockerignore 是否已就位。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


🟡 Medium Priority
变更行→受影响行为:旧 Dockerfile 通过 ENV ... PYTHONUNBUFFERED=1 让 Python 输出无缓冲;新 Dockerfile 删除该 ENV,仅保留第 20 行 ENV PATH=$PATH:/home/app/.local/bin,并以 exec 形式 CMD ["agent-runtime", "--mode", "server"](第 23 行)启动。
失败模式:容器内 stdout 非 tty,Python 默认按块(约 4–8KB)缓冲输出。agent-runtime 是长期运行的服务,其日志不会实时出现在 docker logs,且在容器被 stop/SIGKILL 或崩溃时,缓冲区中尚未刷出的日志会直接丢失,影响排障与可观测性。这是对原镜像行为的明确回退(原显式设置过)。
建议:恢复 PYTHONUNBUFFERED=1(可并入第 20 行 ENV),保证 exec 形式 CMD 启动的 Python 服务日志实时输出且不因缓冲丢失。
| 20
| - ENV PATH=$PATH:/home/app/.local/bin |
|
20 | + ENV PATH=$PATH:/home/app/.local/bin \ |
|
21 | + PYTHONUNBUFFERED=1 |


Paired: GitHub #102 ↔ GitCode !453
What type of PR is this?
/kind feature
Self-checklist:(请自检,在[ ]内打上x,我们将检视你的完成情况,否则会导致pr无法合入)