diff --git a/Dockerfile b/Dockerfile index d730619..138feaf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,63 @@ -# 使用 Node.js 22 版本的轻量级 Alpine 镜像 -FROM node:22-alpine +# ========================================== +# 阶段 1: 构建阶段 (Builder) +# ========================================== +FROM ubuntu:22.04 AS builder -# 设置工作目录 -WORKDIR /workspace +ENV DEBIAN_FRONTEND=noninteractive -# 安装 opencode-ai 并清理 npm 缓存以最小化镜像体积 -RUN npm install -g opencode-ai && \ - npm cache clean --force +# 安装基础依赖 +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl \ + ca-certificates \ + gnupg \ + && rm -rf /var/lib/apt/lists/* -# 验证安装并确认版本 -RUN opencode --version +# 安装 Node.js 22 +RUN mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ + && apt-get update && apt-get install -y nodejs --no-install-recommends \ + && rm -rf /var/lib/apt/lists/* + +# 安装 uv 并利用 uv 下载 Python 3.11 +ENV UV_INSTALL_DIR=/opt/uv +RUN curl -LsSf https://astral.sh/uv/install.sh | sh \ + && /opt/uv/uv python install 3.11 + + +# ========================================== +# 阶段 2: 最终运行阶段 (Final) +# ========================================== +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# 1. 干净地为最终镜像配置 Node.js 22 环境 +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl \ + ca-certificates \ + gnupg \ + && mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ + && apt-get update && apt-get install -y nodejs --no-install-recommends \ + && apt-get purge -y curl gnupg \ + && apt-get autoremove -y \ + && rm -rf /var/lib/apt/lists/* + +# 2. 从 builder 复制 uv 和由 uv 管理的 Python 3.11 +COPY --from=builder /opt/uv/uv /usr/local/bin/uv +COPY --from=builder /root/.local/share/uv/python /root/.local/share/uv/python + +# 3. 核心修复:在最终镜像中用正规的 npm 安装 opencode-ai,确保系统全局软链接生成完整 +RUN npm install -g opencode-ai && npm cache clean --force + +# 4. 精准寻找 uv 的 Python 路径并建立全局 python / python3 软链接(消除通配符失败隐患) +RUN UV_PYTHON_BIN=$(ls /root/.local/share/uv/python/cpython-3.11.*/bin/python3 | head -n 1) \ + && ln -s "$UV_PYTHON_BIN" /usr/local/bin/python3 \ + && ln -s /usr/local/bin/python3 /usr/local/bin/python + +# 5. 验证成果 +RUN opencode --version && uv --version && python3 --version -# 使用 ENTRYPOINT 让容器像原生 CLI 工具一样工作 ENTRYPOINT ["opencode"]