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を使います。