# Stage 1: build the project from source FROM node:22-bullseye-slim AS builder WORKDIR /workspace # Install dependencies at the workspace root COPY package.json package-lock.json ./ RUN npm ci # Copy the rest of the source code COPY . . # Build the project from source RUN npm run build # Stage 2: runtime image FROM node:22-bullseye-slim WORKDIR /workspace # Copy built artifacts from the builder COPY --from=builder /workspace /workspace # Expose a lightweight entrypoint that confirms the build CMD ["bash", "-lc", "echo 'Copilot Chat build complete. Dist available at /workspace/dist'; ls -la /workspace/dist || true; sleep infinity"]
node_modules/ dist/ .vscode/ .git/ **/node_modules coverage/ *.log *.tmp .env .env.* *.swo *.swp .DS_Store package-lock.json
Build status: build_failed Failing step: [builder 4/6] RUN npm ci Exit code: 1 Exact error messages to preserve: - "ERROR: process \"/bin/sh -c npm ci\" did not complete successfully: exit code: 1" - "npm error code 1" - "npm error path /workspace/node_modules/sqlite3" - "npm error command failed" - "npm error command sh -c prebuild-install -r napi || node-gyp rebuild" - "npm error prebuild-install warn This package does not support N-API version undefined" - "npm error prebuild-install warn install No prebuilt binaries found (target=undefined runtime=napi arch=x64 libc= platform=linux)" - "npm error gyp ERR! stack Error: Could not find any Python installation to use" Missing packages/files mentioned: - Python is not installed in the build environment (gyp cannot find Python), which sqlite3 needs to build from source: - "Could not find any Python installation to use" - "Python is not set from command line or npm configuration" Concerns: - COPY --from=builder /workspace /workspace copies the entire build workspace (including node_modules) into the final image; consider copying only built artifacts (e.g., /workspace/dist) and essential runtime files. - Root npm ci may not be ideal for monorepos with workspaces; ensure root package.json and package-lock.json align with repo structure, or adjust build context to install workspace dependencies selectively. - No HEALTHCHECK and runtime just echoes + sleep infinity; for production add a healthcheck or proper entrypoint/server. Environment/context: - Base image: node:22-bullseye-slim - Node version: v22.22.1 - node-gyp version: v10.3.1 - npm: New major version available: 10.9.4 -> 11.12.0 Context summary: - Build fails during npm ci because sqlite3 requires Python for compilation, but Python is not installed or configured in the container.
# Stage 1: build the project from source
FROM node:22-bullseye-slim AS builder
WORKDIR /workspace
# Install build dependencies (Python for node-gyp, compilers)
RUN apt-get update \
&& apt-get install -y --no-install-recommends python3 python3-dev build-essential ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Install root dependencies
COPY package.json package-lock.json ./
RUN npm ci
# Copy the rest of the source code
COPY . .
# Build the project from source
RUN npm run build
# Stage 2: runtime image
FROM node:22-bullseye-slim
WORKDIR /workspace
# Copy built artifacts from the builder (only the dist) and essential runtime files
COPY --from=builder /workspace/dist /workspace/dist
# Expose a lightweight entrypoint that confirms the build
CMD ["bash", "-lc", "echo 'Copilot Chat build complete. Dist available at /workspace/dist'; ls -la /workspace/dist || true; sleep infinity"]
- Exact error message and exit code - Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/workspace/script/postinstall.ts' imported from /workspace/ - Node.js v22.22.1 - exit code: 1 - Failing command/step - Failing step: RUN npm ci (builder 5/7) - Missing packages or files mentioned - Missing file: /workspace/script/postinstall.ts (imported by postinstall step) - Version mismatch information - Base image/Node: node:22-bullseye-slim (Node.js 22) - Node.js version: v22.22.1 - npm notice: New major version of npm available! 10.9.4 -> 11.12.0 - Root cause (brief) - npm ci runs before the rest of the source is copied into the image. The package.json postinstall script attempts to run tsx ./script/postinstall.ts, but /workspace/script/postinstall.ts does not exist yet in the build context at that moment, causing ERR_MODULE_NOT_FOUND. - Suggested fix (brief) - Copy the rest of the source (including script/postinstall.ts) before running npm ci, e.g. copy . . or at least copy the script directory prior to npm ci, or adjust the Dockerfile order to ensure script/postinstall.ts is available when npm ci runs.
# Stage 1: build the project from source
FROM node:22-bullseye-slim AS builder
WORKDIR /workspace
# Install build dependencies (Python for node-gyp, compilers)
RUN apt-get update \
&& apt-get install -y --no-install-recommends python3 python3-dev build-essential ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Copy dependencies manifest first to leverage Docker cache
COPY package.json package-lock.json ./
# Copy the rest of the repository
COPY . .
# Install dependencies and build
RUN npm ci
RUN npm run build
# Stage 2: runtime image
FROM node:22-bullseye-slim
WORKDIR /workspace
# Copy built artifacts and dependencies from the builder
COPY --from=builder /workspace/dist /workspace/dist
COPY --from=builder /workspace/node_modules /workspace/node_modules
COPY --from=builder /workspace/package.json /workspace/package-lock.json /workspace/
COPY --from=builder /workspace/script /workspace/script
# Expose a lightweight entrypoint that confirms the build
CMD ["bash", "-lc", "echo 'Copilot Chat build complete. Dist ready at /workspace/dist'; ls -la /workspace/dist || true; sleep infinity"]
Concerns: Copied node_modules from builder may include devDependencies and build-time artifacts, leading to a larger image. Consider pruning production dependencies in the build stage (e.g., npm ci --only=production) or using a separate prune step., The runtime CMD is a placeholder that only prints a message and sleeps; it does not actually run the built application. If a runnable service is desired, replace with the proper startup command., COPY --from=builder /workspace/script /workspace/script will fail to build if the script directory does not exist in the repository. Smoke [PASS]: test -d /workspace/dist && echo dist_exists Smoke [PASS]: node -v Smoke [PASS]: ls -la /workspace/dist | head -n 5