-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile.runtime
More file actions
76 lines (65 loc) · 3.39 KB
/
Copy pathDockerfile.runtime
File metadata and controls
76 lines (65 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# Multi-stage runtime image: one shared `base`, one thin stage per harness.
# Each harness stage only adds its own agent CLI/SDK on top of `base`; the
# harness is selected at build time with `--target` (zero conditionals), and the
# stage's baked ENV HARNESS makes the image itself the harness selector.
# --target pi -> pi-coding-agent (image: pi-foundry-runtime, ~655MB)
# --target copilot -> @github/copilot-sdk (image: ghcp-foundry-runtime, ~1.75GB)
# --target codex -> @openai/codex-sdk (image: codex-foundry-runtime)
# --target opencode -> opencode-ai CLI + sdk (image: opencode-foundry-runtime)
# Adding a harness = add one `FROM base AS <name>` stage below (+ its adapter in
# src/adapters and a case in src/adapters/index.mjs).
# --- shared base ------------------------------------------------------------
FROM node:24-bookworm-slim AS base
ENV NODE_ENV=production \
PORT=8088 \
HOST=0.0.0.0 \
HOME=/home/node \
WORKSPACE_DIR=/workspace \
STATE_DIR=/home/node/.open-foundry \
SESSIONS_DIR=/home/node/.open-foundry/sessions \
PI_CODING_AGENT_DIR=/home/node/.open-foundry/pi-agent
# Pure Node runtime: a single Node process serves /readiness and POST /invocations.
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p /app /workspace /home/node/.open-foundry \
&& chown -R node:node /app /workspace /home/node \
&& printf '#!/bin/sh\nexec node /app/src/cli.mjs "$@"\n' > /usr/local/bin/open-foundry \
&& chmod +x /usr/local/bin/open-foundry
USER node
WORKDIR /app
# package.json holds only shared runtime deps; each harness stage installs its
# own agent. Keeps every image slim and avoids cross-harness coupling.
COPY --chown=node:node package.json package-lock.json ./
RUN npm ci --omit=dev
COPY --chown=node:node src ./src
EXPOSE 8088
# Single Node process serves /readiness and POST /invocations directly on PORT.
CMD ["node", "/app/src/backend.mjs"]
# --- pi harness -------------------------------------------------------------
# pi-coding-agent SDK runtime, imported in-process by src/adapters/pi-sdk.mjs.
FROM base AS pi
ENV HARNESS=pi
RUN npm install --no-save @earendil-works/pi-coding-agent@0.76.0 --ignore-scripts
# --- copilot harness --------------------------------------------------------
# Copilot SDK / CLI runtime, loaded lazily by src/adapters/copilot-sdk.mjs.
FROM base AS copilot
ENV HARNESS=copilot
RUN npm install --no-save @github/copilot-sdk@1.0.0-beta.12
# --- codex harness ----------------------------------------------------------
# OpenAI Codex SDK / CLI runtime, loaded lazily by src/adapters/codex-sdk.mjs.
# @openai/codex-sdk pins and pulls the matching @openai/codex CLI binary.
FROM base AS codex
ENV HARNESS=codex
RUN npm install --no-save @openai/codex-sdk@0.138.0
# --- opencode harness -------------------------------------------------------
# OpenCode CLI + SDK runtime, loaded lazily by src/adapters/opencode-sdk.mjs.
# opencode-ai ships the `opencode` binary (the SDK spawns `opencode serve`);
# @opencode-ai/sdk drives it over HTTP. The openai-compatible/azure model
# providers are bundled into the opencode binary, so no provider npm is
# downloaded at runtime.
FROM base AS opencode
ENV HARNESS=opencode \
OPENCODE_DISABLE_AUTOUPDATE=1 \
PATH=/app/node_modules/.bin:$PATH
RUN npm install --no-save opencode-ai@1.17.0 @opencode-ai/sdk@1.15.11