fix(docker): copy scripts/ before npm ci so the fail-loud postinstall can run

The root postinstall runs scripts/link-libsodium.mjs, but the Dockerfile
never copied scripts/ into either stage - npm ci ran with only the
package.json files present, so the script was missing and npm exited 1.

This was latent until the postinstall stopped ending in `|| true`. The old
shell one-liner swallowed its own failure, so a missing script looked like a
successful install; making it fail-loud surfaced the gap on the first build
after that change.

CI did not catch it because actions/checkout gives the workflow a full
working tree, so scripts/ is always present there. Only the image build
exercises the COPY set, and only the deploy workflow builds the image.

Verified: with scripts/ present the postinstall exits 0 ("already matches the
source, nothing to do"); without it, node throws MODULE_NOT_FOUND, which is
the exact failure in the deploy logs. libsodium-sumo is a production
dependency (dev=false), so the --omit=dev runtime stage installs it and the
script finds its source there too.
This commit is contained in:
FilipBl4gojevic
2026-08-03 13:55:41 +02:00
parent 30f2d5087b
commit d8bb451cab

View File

@@ -3,6 +3,11 @@ WORKDIR /app
COPY package*.json ./ COPY package*.json ./
COPY packages/shared/package.json ./packages/shared/ COPY packages/shared/package.json ./packages/shared/
COPY packages/builder/package.json ./packages/builder/ COPY packages/builder/package.json ./packages/builder/
# The root postinstall runs scripts/link-libsodium.mjs, so that script has to be
# present before `npm ci`, not with the later source COPY. It is fail-loud by
# design (the old shell one-liner ended in `|| true` and silently no-opped), so a
# missing script fails the build here rather than shipping a broken image.
COPY scripts/ ./scripts/
RUN npm ci RUN npm ci
COPY packages/ ./packages/ COPY packages/ ./packages/
RUN npm run build RUN npm run build
@@ -12,6 +17,8 @@ WORKDIR /app
COPY package*.json ./ COPY package*.json ./
COPY packages/shared/package.json ./packages/shared/ COPY packages/shared/package.json ./packages/shared/
COPY packages/builder/package.json ./packages/builder/ COPY packages/builder/package.json ./packages/builder/
# Same reason as the builder stage: postinstall needs this before `npm ci`.
COPY scripts/ ./scripts/
RUN npm ci --omit=dev RUN npm ci --omit=dev
COPY --from=builder /app/packages/builder/build/ ./packages/builder/build/ COPY --from=builder /app/packages/builder/build/ ./packages/builder/build/
EXPOSE 3000 EXPOSE 3000