Codex Docker 沙箱

从 Dagu Docker 沙箱运行 Codex。

准备包含 Codex CLI 的 runner 镜像,然后让 Dagu 在步骤级或根级 container 中运行 provider: codex。容器能读取文件型 CODEX_HOME 时可复用 ChatGPT 登录;API key 运行可使用 CODEX_API_KEY。

Docker 中的 Codex 登录检查
steps:
  - id: codex_login_status
    action: harness.run
    container:
      image: dagu-codex-runner:local
      pull_policy: never
      working_dir: /workspace
      volumes:
        - .:/workspace:ro
        - ${HOME}/.codex:/codex-home
      env:
        - CODEX_HOME=/codex-home
    with:
      provider: shell
      prompt: |
        set -eu
        codex --version
        codex login status

使用公开的 ghcr.io/openai/codex-universal 基础镜像。

在模型调用前验证 codex --version 和登录状态。

支持挂载 CODEX_HOME 复用 ChatGPT 订阅登录。

支持用 CODEX_API_KEY 进行非交互 codex exec 运行。

01

Runner 镜像

把 Codex 安装到 runner 镜像,并清空基础镜像 entrypoint,让 Dagu 控制命令。镜像用于 DAG 之前应先通过版本检查。

Dockerfile
FROM ghcr.io/openai/codex-universal:latest

USER root
RUN apt-get update \
  && apt-get install -y --no-install-recommends ca-certificates curl \
  && rm -rf /var/lib/apt/lists/*

ENV CODEX_NON_INTERACTIVE=1 \
    CODEX_INSTALL_DIR=/usr/local/bin

RUN curl -fsSL https://chatgpt.com/codex/install.sh | sh
RUN codex --version

WORKDIR /workspace
ENTRYPOINT []
CMD ["/bin/bash"]
02

ChatGPT 订阅认证

如果主机 CLI 已用 ChatGPT 登录且凭据保存在文件中,把该 Codex home 挂载到单独路径,并在容器内设置 CODEX_HOME。

  • 不要在该镜像中覆盖 /root/.codex,因为独立包缓存位于那里。
  • 如果主机使用 OS keychain,请为 Dagu worker 创建单独的文件型 CODEX_HOME。
  • auth.json 包含访问令牌,应作为秘密处理。
03

API key 运行

对于不复用 ChatGPT 登录的自动化,只把 CODEX_API_KEY 传给运行 Codex 的 harness 步骤。

步骤级 Codex 运行
steps:
  - id: codex_review
    action: harness.run
    container:
      image: dagu-codex-runner:local
      pull_policy: never
      working_dir: /workspace
      volumes:
        - .:/workspace:ro
      env:
        - CODEX_API_KEY=${CODEX_API_KEY}
    with:
      provider: codex
      prompt: |
        Review this repository and summarize the highest-risk issues.
04

容器作用域

只有 Codex 需要凭据时使用步骤级 container。只有当 command 步骤和 Codex 需要共享同一工具链和 workspace 时,才使用根级 container。