# Dev-only image for the dockerised full-stack dev mode (ADR-0030). # # One image serves all three Nx apps (portal-bff / portal-shell / # portal-admin) — the monorepo means a single install. The image is # intentionally minimal: Node + corepack, nothing copied in. The repo # is bind-mounted at runtime and dependencies install into a named # volume (see dev.compose.yml `apps` profile), so node_modules — with # its native modules built for THIS image — is never shadowed by the # host's. # # NOT a production image. Production artefacts are out of scope per # ADR-0030 and tracked against the ADR-0028 Container Registry work. FROM node:24-bookworm # corepack ships with Node 24. Enabling it lets pnpm resolve from the # `packageManager` field in package.json at runtime — no version pinned # here, so this image never drifts from the repo's pinned pnpm. RUN corepack enable # Nx + Angular CLI memory ceiling — matches the devcontainer (.devcontainer/ # devcontainer.json). 4 GB avoids OOM on large `nx` graph work. ENV NODE_OPTIONS=--max-old-space-size=4096 # Nx daemon is per-container and would contend across the three app # containers sharing one workspace bind-mount — disable it. Slight # task-graph cost, robust behaviour. ENV NX_DAEMON=false WORKDIR /workspace # No COPY / no install at build time: the repo is bind-mounted and the # `apps-deps` one-shot service installs into the node_modules volume on # first boot. Build context stays tiny (just infra/local/) — nothing is # copied. Invoked via `bash` so it does not depend on the bind-mounted # script keeping its executable bit. ENTRYPOINT ["bash", "/workspace/infra/local/dev-entrypoint.sh"]