Files
qiming/qiming-rcoder/docker/rcoder-agent-runner/Dockerfile
2026-06-01 13:54:52 +08:00

247 lines
11 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================================
# 最终镜像 Dockerfile - rcoder-agent-runner
# ============================================================================
# 此镜像基于基础镜像 rcoder-agent-base:latest
# 只包含业务代码和配置文件,构建速度快
# 构建命令: make docker-build-agent-runner 或 make dev-restart
# ============================================================================
# 使用本地基础镜像
ARG BASE_IMAGE=rcoder-agent-base:latest
FROM ${BASE_IMAGE}
# 设置工作目录
WORKDIR /home/user
# agent-browser 默认配置(独立 Chromium profile避免与 MCP 锁冲突)
ENV AGENT_BROWSER_EXECUTABLE_PATH=/usr/local/bin/chromium \
AGENT_BROWSER_PROFILE=/home/user/.config/agent-browser/chromium \
AGENT_BROWSER_HEADED=1
# ============================================================================
# 📦 复制业务代码和配置文件
# ============================================================================
# 使用构建参数破坏缓存(每次构建都获取最新版本的工具)
ARG CACHEBUST=1
# 安装 mcp-stdio-proxy频繁更新的工具放在最终镜像以加快构建
# 使用 CACHEBUST 变量触发缓存失效
RUN . /opt/cargo/env && echo "Cache bust: ${CACHEBUST}" && cargo install mcp-stdio-proxy
# # 安装 claude-code-acp-rs CLI 工具
# RUN . /opt/cargo/env && echo "Cache bust: ${CACHEBUST}" && cargo install claude-code-acp-rs --no-default-features --features otel,sacp-flush
# 安装 agent-browser CLI仅安装命令行工具不在构建期下载浏览器
RUN . /opt/cargo/env && \
echo "Cache bust: ${CACHEBUST}" && \
cargo install agent-browser && \
agent-browser --version
# 测试agent
RUN echo "Cache bust: ${CACHEBUST}" && npm install -g claude-code-acp-ts@latest
# 安装 nuwaxcode频繁更新的工具放在最终镜像以加快构建
# 使用 CACHEBUST 变量触发缓存失效
# 安装失败时主动退出,避免构建包含不完整的镜像
RUN echo "Cache bust: ${CACHEBUST}" && \
echo "📦 开始安装 nuwaxcode..." && \
npm i -g nuwaxcode@latest && \
echo "✅ nuwaxcode 安装完成,开始验证..." && \
which nuwaxcode && \
echo "✅ nuwaxcode 验证成功: $(nuwaxcode -v)" || \
(echo "❌ nuwaxcode 安装或验证失败,构建中断" && exit 1)
# 配置 nuwaxcode - 禁用 websearch, webfetch 和 question 权限
RUN mkdir -p /root/.config/opencode && \
echo '{\n "permission": {\n "websearch": "deny",\n "webfetch": "deny",\n "question": "deny"\n }\n}' > /root/.config/opencode/opencode.json
# # 安装 opencode - AI 驱动的代码导航工具
# # 注意npm 包不支持 ARM64使用官方安装脚本
# RUN echo "📦 安装 opencode..." && \
# curl -fsSL https://opencode.ai/install | bash && \
# ln -sf /root/.opencode/bin/opencode /usr/local/bin/opencode && \
# echo "验证 opencode 安装..." && \
# opencode --version && \
# echo "✅ opencode 安装成功(已创建符号链接到 /usr/local/bin"
# ============================================================================
# 🔧 eBPF 诊断工具安装
# 注意:这些工具会增加镜像大小 (~500MB)
# 通过 make dev-restart 默认启用
# ============================================================================
ARG INSTALL_EBPF_TOOLS=false
RUN if [ "$INSTALL_EBPF_TOOLS" = "true" ]; then \
echo "🔧 开始安装 eBPF 诊断工具..."; \
apt-get update && \
echo "📦 安装 bpftrace核心 eBPF 诊断工具)..."; \
apt-get install -y bpftrace && \
echo "📦 安装 strace系统调用追踪..."; \
apt-get install -y strace && \
echo "📦 安装 sysstat性能监控iostat, mpstat 等)..."; \
apt-get install -y sysstat && \
echo "📦 安装 jqJSON 处理)..."; \
apt-get install -y jq && \
rm -rf /var/lib/apt/lists/*; \
echo "✅ eBPF 诊断工具安装完成"; \
which bpftrace && bpftrace --version || echo "❌ bpftrace 未安装"; \
else \
echo "⚠️ eBPF 工具未安装(生产模式)"; \
fi
# 安装 FlameGraph 工具
RUN if [ "$INSTALL_EBPF_TOOLS" = "true" ]; then \
if [ "${USE_GITHUB_MIRROR}" = "true" ]; then \
git clone ${GITHUB_MIRROR_URL}brendangregg/FlameGraph /tmp/FlameGraph; \
else \
git clone https://github.com/brendangregg/FlameGraph /tmp/FlameGraph; \
fi && \
cp /tmp/FlameGraph/*.pl /usr/local/bin/ \
&& rm -rf /tmp/FlameGraph \
&& echo "✅ FlameGraph 工具已安装"; \
fi
# ============================================================================
# 📊 Pyroscope Agent - 持续剖析(已废弃,保留用于兼容性)
# ============================================================================
ARG INSTALL_PYROSCOPE=false
RUN if [ "$INSTALL_PYROSCOPE" = "true" ]; then \
echo "📦 安装 Pyroscope Agent..."; \
apt-get update && \
apt-get install -y curl ca-certificates && \
echo "下载 Pyroscope Agent (v1.17.0)..." && \
curl -fsSL "https://github.com/grafana/pyroscope/releases/download/v1.17.0/pyroscope_1.17.0_linux_arm64.tar.gz" \
-o /tmp/pyroscope.tar.gz && \
echo "解压 Pyroscope Agent..." && \
tar -xzf /tmp/pyroscope.tar.gz -C /usr/local/bin/ && \
rm /tmp/pyroscope.tar.gz && \
chmod +x /usr/local/bin/pyroscope && \
echo "验证 Pyroscope Agent..." && \
pyroscope --version || echo "⚠️ Pyroscope 安装失败"; \
else \
echo "⚠️ Pyroscope 未安装"; \
fi
# ============================================================================
# 📊 Grafana Alloy - 持续性能数据采集(替代已废弃的 Pyroscope Agent
# ============================================================================
ARG INSTALL_ALLOY=false
ARG ALLOY_VERSION=v1.12.2
RUN if [ "$INSTALL_ALLOY" = "true" ]; then \
echo "📦 安装 Grafana Alloy ${ALLOY_VERSION}..."; \
apt-get update && \
apt-get install -y wget ca-certificates && \
echo "检测系统架构..."; \
ARCH=$(dpkg --print-architecture); \
echo "系统架构: ${ARCH}"; \
ALLOY_VER=${ALLOY_VERSION}; \
ALLOY_VER_NUM=${ALLOY_VER#v}; \
echo "下载 Alloy deb 包 (${ARCH})..."; \
wget -qO- "https://github.com/grafana/alloy/releases/download/${ALLOY_VER}/alloy-${ALLOY_VER_NUM}-1.${ARCH}.deb" > /tmp/alloy.deb && \
echo "下载完成,文件大小: $(ls -lh /tmp/alloy.deb | awk '{print $5}')"; \
echo "安装 Alloy..."; \
dpkg -i /tmp/alloy.deb && \
apt-get install -y -f && \
rm /tmp/alloy.deb && \
echo "验证 Alloy 安装..."; \
alloy --version; \
else \
echo "⚠️ Alloy 未安装"; \
fi
# ============================================================================
# 🔍 bpfcc-tools - Off-CPU 阻塞分析工具
# ============================================================================
RUN if [ "$INSTALL_EBPF_TOOLS" = "true" ]; then \
echo "📦 安装 bpfcc-tools (包含 offcputime)..."; \
apt-get update && \
apt-get install -y bpfcc-tools && \
rm -rf /var/lib/apt/lists/* && \
which offcputime-bpfcc && offcputime-bpfcc --help | head -3 || echo "⚠️ offcputime-bpfcc 安装失败"; \
fi
# 复制预构建的 agent_runner 二进制文件
COPY bin/agent_runner /usr/local/bin/agent_runner
RUN chmod +x /usr/local/bin/agent_runner
# 复制启动脚本
COPY ./start-up.sh /root/
RUN chmod +x /root/start-up.sh
# 复制中文输入法修复脚本(容器内运行 fix-ime 命令)
COPY ./fix-chrome-ime-final.sh /usr/local/bin/fix-ime
RUN chmod +x /usr/local/bin/fix-ime
# 复制音频服务脚本和静态文件
COPY audio_server.py /usr/local/bin/audio_server.py
COPY audio_static /usr/local/share/audio_static
RUN chmod +x /usr/local/bin/audio_server.py
# 复制 MCP 配置文件(用于容器启动时的共享 MCP 代理服务)
COPY mcp /etc/mcp
# 复制 IME 服务脚本(允许用户使用宿主机输入法输入到远程桌面)
COPY ime_server.py /usr/local/bin/ime_server.py
RUN chmod +x /usr/local/bin/ime_server.py
# ============================================================================
# 🔧 eBPF 工具目录
# ============================================================================
# 复制整个 eBPF 工具目录到容器中
COPY ebpf-tools /usr/local/bin/ebpf-tools
RUN chmod +x /usr/local/bin/ebpf-tools/*.sh && \
ls -la /usr/local/bin/ebpf-tools/ && \
echo "✅ eBPF 工具目录已创建: /usr/local/bin/ebpf-tools/"
# 创建便捷的快捷命令(包装脚本)
RUN echo '#!/bin/bash\n/usr/local/bin/ebpf-tools/diag-tool.sh offcpu "$@"' > /usr/local/bin/e-offcpu && \
echo '#!/bin/bash\n/usr/local/bin/ebpf-tools/diag-tool.sh flame "$@"' > /usr/local/bin/e-flame && \
echo '#!/bin/bash\n/usr/local/bin/ebpf-tools/diag-tool.sh profile "$@"' > /usr/local/bin/e-profile && \
echo '#!/bin/bash\n/usr/local/bin/ebpf-tools/diag-tool.sh all "$@"' > /usr/local/bin/e-all && \
echo '#!/bin/bash\n/usr/local/bin/ebpf-tools/auto-flamegraph.sh start' > /usr/local/bin/e-auto-flame && \
echo '#!/bin/bash\n/usr/local/bin/ebpf-tools/offcpu-monitor.sh start' > /usr/local/bin/e-offcpu-monitor && \
echo '#!/bin/bash\n/usr/local/bin/ebpf-tools/syscall-monitor.sh start' > /usr/local/bin/e-syscall-monitor && \
chmod +x /usr/local/bin/e-offcpu /usr/local/bin/e-flame /usr/local/bin/e-profile /usr/local/bin/e-all /usr/local/bin/e-auto-flame /usr/local/bin/e-offcpu-monitor /usr/local/bin/e-syscall-monitor && \
echo "✅ eBPF 诊断快捷命令已创建:" && \
echo " - e-offcpu, e-flame, e-profile, e-all (手动 CPU 诊断)" && \
echo " - e-auto-flame (自动火焰图生成)" && \
echo " - e-offcpu-monitor (Off-CPU 阻塞监控)" && \
echo " - e-syscall-monitor (系统调用监控)"
# ============================================================================
# 📊 Grafana Alloy 配置文件
# ============================================================================
# 复制 Alloy 配置文件到容器(从 ebpf-tools 目录统一管理)
COPY ebpf-tools/alloy-config.alloy /etc/alloy/config.alloy
# 验证 Alloy 配置文件语法
RUN if command -v alloy >/dev/null 2>&1; then \
echo "验证 Alloy 配置文件..." && \
alloy validate /etc/alloy/config.alloy || echo "⚠️ Alloy 配置验证失败"; \
else \
echo "⚠️ Alloy 未安装,跳过配置验证"; \
fi
# ============================================================================
# 🔧 暴露端口
# ============================================================================
# 暴露 agent_runner 端口
EXPOSE 8086
# 暴露音频流端口
EXPOSE 6090
EXPOSE 6089
# 暴露 IME 服务端口
EXPOSE 6091
# ============================================================================
# 🚀 启动配置
# ============================================================================
ENTRYPOINT ["/root/start-up.sh"]