Codex Docker サンドボックス

DaguのDockerサンドボックスからCodexを実行する。

Codex CLIを含むランナーイメージを用意し、Daguでprovider: codexをステップレベルまたはルートレベルcontainer内で実行します。ファイルベースのCODEX_HOMEを読める場合はChatGPTログインを再利用でき、APIキー実行では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とログイン状態を確認します。

ChatGPTサブスクリプションログインにはCODEX_HOMEのマウントを使えます。

非対話のcodex execにはCODEX_API_KEYを渡せます。

01

ランナーイメージ

Codexをランナーイメージにインストールし、ベースイメージの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キーチェーンを使う場合は、Dagu worker用にファイル保存のCODEX_HOMEを別途作ります。
  • auth.jsonにはアクセストークンが含まれるため、秘密情報として扱います。
03

APIキーでの実行

ChatGPTログインを再利用しない自動化では、Codexを実行するharnessステップだけにCODEX_API_KEYを渡します。

ステップレベルの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を使います。コマンドステップとCodexで同じツールチェーンやworkspaceを共有したい場合だけルートレベルcontainerを使います。