# Codex app-server 任务镜像:只含运行环境 + codex 二进制,代码运行时挂载。 # # 构建(在 codex-app-server 仓库根目录,构建上下文就是仓库根): # docker build -f cloud/docker/Dockerfile -t codex-app-server:latest \ # --build-arg CODEX_BIN_DIR=bin . # # 说明(不要绕过去): # - CODEX_BIN_DIR 是调用方在构建主机上提供的配对二进制目录 # (npm 安装 @openai/codex 后自带 codex + codex-code-mode-host + # codex-resources/bwrap,约 367M)。bin/ 不进仓库、不进镜像层 # 之外的任何地方;没有配对二进制就不要构建,构建会直接失败, # 绝不静默用一个缺 sibling 的裸二进制。 # - host.py / cloud/ 代码不在镜像里:运行时由 DockerExecutor 以 # 只读方式挂载到 /app(-v <代码目录>:/app:ro),代码改了不用 # 重新构建镜像;codex 版本变了才需要重新构建。 # - 任务自己的 worktree 运行时挂载到 /work(可写),绝不挂载宿主 # 根目录、绝不挂载任何含密钥的目录。 # - 镜像里不含任何 key:模型 key 运行时由 DockerExecutor 以 # `-e ` 从宿主进程环境注入容器,不写进 Dockerfile、 # 不写进镜像层、不写进日志。 # - codex 自带的 bubblewrap 沙箱在容器内是否可用,取决于宿主 # 的容器权限配置,本镜像不假装解决:真实环境实测时若 bwrap # 不可用,host.py 的 sandbox 参数仍可退到 read-only / # workspace-write 的控制面约束,见 cloud/README.md。 ARG PYTHON_VERSION=3.12-slim FROM python:${PYTHON_VERSION} # 文档 / 图片工具(document-tools、image-workflow 技能的核查项): # - pandoc:通用文档转换;poppler-utils:pdftotext(PDF 读回)。 # - latexmk + texlive-latex-base:pdflatex 编译(英文 LaTeX; # 中文 LaTeX 仍需 xelatex + CJK 字体,见下,本镜像故意不装: # texlive-xetex + fonts-noto-cjk 会再增数百 MB,主机盘已 89%, # 中文 LaTeX 缺 xelatex 时技能按规则明说,不伪造)。 # - pip:python-docx / openpyxl / python-pptx / PyMuPDF(fitz)/ # Pillow——技能核查的 Python 库与图片处理(Pillow 有其一即可 # 做裁剪/缩放/转格式)。图片“生成”仍未配置:本镜像不装、 # 不接任何生成端点,生成需求技能仍按规则明说无法生成。 # - --no-cache-dir:pip 不留缓存层,镜像不虚胖。 RUN apt-get update \ && apt-get install -y --no-install-recommends git pandoc poppler-utils latexmk texlive-latex-base \ && rm -rf /var/lib/apt/lists/* \ && pip install --no-cache-dir python-docx openpyxl python-pptx PyMuPDF Pillow ARG CODEX_BIN_DIR=bin COPY ${CODEX_BIN_DIR}/codex /usr/local/bin/codex COPY ${CODEX_BIN_DIR}/codex-code-mode-host /usr/local/bin/codex-code-mode-host # 关键:codex 找 bundled bwrap 只看自身旁边的 codex-resources, # 不能放到 /usr/local/lib 下(上一版镜像就是这么丢的,导致 # 容器内报 bubblewrap is unavailable,工具全失败)。 # 同时把 bwrap 放进 PATH,双保险。 COPY ${CODEX_BIN_DIR}/codex-resources /usr/local/bin/codex-resources RUN chmod +x /usr/local/bin/codex /usr/local/bin/codex-code-mode-host \ && ln -sf /usr/local/bin/codex-resources/bwrap /usr/local/bin/bwrap \ && /usr/local/bin/bwrap --version WORKDIR /work # 无 ENTRYPOINT:DockerExecutor 显式传完整容器内命令 # (python3 /app/host.py dispatch/run/status ...),镜像只提供环境。 CMD ["python3", "--version"]