build: compile better-sqlite3 from source (no Node 20 prebuilt)
OpenSSF Scorecard / Scorecard analysis (push) Waiting to run
CI / Build & test (Node 20) (push) Canceled after 0s
CI / Build & test (Node 24) (push) Canceled after 0s
CI / Build & test (push) Canceled after 0s
CodeQL / Analyze (javascript-typescript) (push) Canceled after 0s
Security / Secret scan (gitleaks) (push) Canceled after 0s
Security / Dependency scan (OSV-Scanner) (push) Canceled after 0s
Security / IaC/config scan (Trivy) (push) Canceled after 0s
Security / License compliance scan (Trivy) (push) Canceled after 0s
OpenSSF Scorecard / Scorecard analysis (push) Waiting to run
CI / Build & test (Node 20) (push) Canceled after 0s
CI / Build & test (Node 24) (push) Canceled after 0s
CI / Build & test (push) Canceled after 0s
CodeQL / Analyze (javascript-typescript) (push) Canceled after 0s
Security / Secret scan (gitleaks) (push) Canceled after 0s
Security / Dependency scan (OSV-Scanner) (push) Canceled after 0s
Security / IaC/config scan (Trivy) (push) Canceled after 0s
Security / License compliance scan (Trivy) (push) Canceled after 0s
better-sqlite3@12.11.1 ships prebuilt binaries for ABI 127/137/141/147 only; Node 20 is ABI 115, so prebuild-install falls back to node-gyp, which fails on node:20-slim for lack of python3/make/g++. Add the toolchain to the builder stage, and in the runtime stage install, use and purge it inside a single layer so the final image ships no compiler.
This commit is contained in:
+22
-3
@@ -21,6 +21,15 @@ COPY packages/web/package.json packages/web/
|
||||
# Copy patches (referenced by pnpm-lock.yaml)
|
||||
COPY patches/ patches/
|
||||
|
||||
# better-sqlite3 publishes no prebuilt binary for Node 20 (ABI 115) — its
|
||||
# releases cover ABI 127/137/141/147 only — so prebuild-install falls back to
|
||||
# compiling with node-gyp, which needs python3/make/g++. node:20-slim ships
|
||||
# none of them. Builder stage only: the runtime stage copies the compiled
|
||||
# .node and stays slim.
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
python3 make g++ \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install dependencies
|
||||
RUN pnpm install --frozen-lockfile
|
||||
|
||||
@@ -39,7 +48,9 @@ FROM node:20-slim AS runtime
|
||||
RUN corepack enable && corepack prepare pnpm@10.34.3 --activate
|
||||
|
||||
# Runtime deps only: ffmpeg (media processing) + gosu (drop to non-root in the
|
||||
# entrypoint). No C toolchain — better-sqlite3 and sharp load prebuilt binaries.
|
||||
# entrypoint). sharp is N-API (ABI-independent) and loads a prebuilt binary;
|
||||
# better-sqlite3 no longer ships one for Node 20, so it is compiled below with
|
||||
# a toolchain that is purged in the same layer.
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends ffmpeg gosu && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
@@ -58,8 +69,16 @@ COPY packages/web/package.json packages/web/
|
||||
# Copy patches (referenced by pnpm-lock.yaml)
|
||||
COPY patches/ patches/
|
||||
|
||||
# Install production dependencies only (tsx is in server dependencies)
|
||||
RUN pnpm install --prod --frozen-lockfile
|
||||
# Install production dependencies only (tsx is in server dependencies).
|
||||
# better-sqlite3 compiles from source here (no Node 20 prebuilt), so the C
|
||||
# toolchain is installed, used and purged inside this single layer — the final
|
||||
# image ships no compiler.
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends python3 make g++ && \
|
||||
pnpm install --prod --frozen-lockfile && \
|
||||
apt-get purge -y python3 make g++ && \
|
||||
apt-get autoremove -y && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy shared source (needed at runtime since server imports types directly)
|
||||
COPY packages/shared/ packages/shared/
|
||||
|
||||
Reference in New Issue
Block a user