From 51145a738320078eb6414963454a0128d74ade82 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 5 Mar 2026 23:33:08 -0800 Subject: [PATCH] Fix docker example codex startup --- docs/deploy/docker.mdx | 19 +++++++------------ examples/docker/src/index.ts | 19 ++++++++++++++----- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/docs/deploy/docker.mdx b/docs/deploy/docker.mdx index 28c9f77..1c64af8 100644 --- a/docs/deploy/docker.mdx +++ b/docs/deploy/docker.mdx @@ -16,17 +16,11 @@ docker run --rm -p 3000:3000 \ -e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \ -e OPENAI_API_KEY="$OPENAI_API_KEY" \ alpine:latest sh -c "\ - apk add --no-cache curl ca-certificates libstdc++ libgcc bash && \ + apk add --no-cache curl ca-certificates libstdc++ libgcc bash nodejs npm && \ curl -fsSL https://releases.rivet.dev/sandbox-agent/0.2.x/install.sh | sh && \ - sandbox-agent install-agent claude && \ - sandbox-agent install-agent codex && \ sandbox-agent server --no-token --host 0.0.0.0 --port 3000" ``` - -Alpine is required for some agent binaries that target musl libc. - - ## TypeScript with dockerode ```typescript @@ -37,17 +31,18 @@ const docker = new Docker(); const PORT = 3000; const container = await docker.createContainer({ - Image: "alpine:latest", + Image: "node:22-bookworm-slim", Cmd: ["sh", "-c", [ - "apk add --no-cache curl ca-certificates libstdc++ libgcc bash", + "apt-get update", + "DEBIAN_FRONTEND=noninteractive apt-get install -y curl ca-certificates bash libstdc++6", + "rm -rf /var/lib/apt/lists/*", "curl -fsSL https://releases.rivet.dev/sandbox-agent/0.2.x/install.sh | sh", - "sandbox-agent install-agent claude", - "sandbox-agent install-agent codex", `sandbox-agent server --no-token --host 0.0.0.0 --port ${PORT}`, ].join(" && ")], Env: [ `ANTHROPIC_API_KEY=${process.env.ANTHROPIC_API_KEY}`, `OPENAI_API_KEY=${process.env.OPENAI_API_KEY}`, + `CODEX_API_KEY=${process.env.CODEX_API_KEY}`, ].filter(Boolean), ExposedPorts: { [`${PORT}/tcp`]: {} }, HostConfig: { @@ -61,7 +56,7 @@ await container.start(); const baseUrl = `http://127.0.0.1:${PORT}`; const sdk = await SandboxAgent.connect({ baseUrl }); -const session = await sdk.createSession({ agent: "claude" }); +const session = await sdk.createSession({ agent: "codex" }); await session.prompt([{ type: "text", text: "Summarize this repository." }]); ``` diff --git a/examples/docker/src/index.ts b/examples/docker/src/index.ts index b876ba8..593ef31 100644 --- a/examples/docker/src/index.ts +++ b/examples/docker/src/index.ts @@ -1,9 +1,16 @@ import Docker from "dockerode"; +import fs from "node:fs"; +import path from "node:path"; import { SandboxAgent } from "sandbox-agent"; import { detectAgent, buildInspectorUrl } from "@sandbox-agent/example-shared"; -const IMAGE = "alpine:latest"; +const IMAGE = "node:22-bookworm-slim"; const PORT = 3000; +const agent = detectAgent(); +const codexAuthPath = process.env.HOME ? path.join(process.env.HOME, ".codex", "auth.json") : null; +const bindMounts = codexAuthPath && fs.existsSync(codexAuthPath) + ? [`${codexAuthPath}:/root/.codex/auth.json:ro`] + : []; const docker = new Docker({ socketPath: "/var/run/docker.sock" }); @@ -24,20 +31,22 @@ console.log("Starting container..."); const container = await docker.createContainer({ Image: IMAGE, Cmd: ["sh", "-c", [ - "apk add --no-cache curl ca-certificates libstdc++ libgcc bash", + "apt-get update", + "DEBIAN_FRONTEND=noninteractive apt-get install -y curl ca-certificates bash libstdc++6", + "rm -rf /var/lib/apt/lists/*", "curl -fsSL https://releases.rivet.dev/sandbox-agent/0.2.x/install.sh | sh", - "sandbox-agent install-agent claude", - "sandbox-agent install-agent codex", `sandbox-agent server --no-token --host 0.0.0.0 --port ${PORT}`, ].join(" && ")], Env: [ process.env.ANTHROPIC_API_KEY ? `ANTHROPIC_API_KEY=${process.env.ANTHROPIC_API_KEY}` : "", process.env.OPENAI_API_KEY ? `OPENAI_API_KEY=${process.env.OPENAI_API_KEY}` : "", + process.env.CODEX_API_KEY ? `CODEX_API_KEY=${process.env.CODEX_API_KEY}` : "", ].filter(Boolean), ExposedPorts: { [`${PORT}/tcp`]: {} }, HostConfig: { AutoRemove: true, PortBindings: { [`${PORT}/tcp`]: [{ HostPort: `${PORT}` }] }, + Binds: bindMounts, }, }); await container.start(); @@ -45,7 +54,7 @@ await container.start(); const baseUrl = `http://127.0.0.1:${PORT}`; const client = await SandboxAgent.connect({ baseUrl }); -const session = await client.createSession({ agent: detectAgent(), sessionInit: { cwd: "/root", mcpServers: [] } }); +const session = await client.createSession({ agent, sessionInit: { cwd: "/root", mcpServers: [] } }); const sessionId = session.id; console.log(` UI: ${buildInspectorUrl({ baseUrl, sessionId })}`);