From 83f5b88d94b1d0c3b2f2f2d4832e1018d08ad019 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Tue, 21 Apr 2026 11:49:41 +0200 Subject: [PATCH] fix(docker): node-addon-api + ignore-scripts/rebuild fuer sharp Drei Schichten Absicherung gegen den arm64-Build-Fehler: - --ignore-scripts beim npm install verhindert, dass sharp's postinstall check.js laeuft, bevor das @img/sharp-linuxmusl-arm64-Paket entpackt ist (Race in parallelem Install). - npm rebuild danach: alle Deps sind jetzt auf Disk, Postinstalls laufen sauber in Dependency-Reihenfolge. - node-addon-api als Runtime-Dep: falls die Prebuilt-Binary im npm-Tree nicht landet, kann sharp from-source bauen (vips-dev + python3 + make + g++ sind im Dockerfile bereits installiert). Co-Authored-By: Claude Opus 4.7 (1M context) --- Dockerfile | 24 ++++++++++++++---------- package-lock.json | 10 ++++++++++ package.json | 1 + 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 327a209..2552c87 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,21 +8,25 @@ WORKDIR /app RUN apk add --no-cache python3 make g++ libc6-compat vips-dev COPY package*.json ./ -# Bewusst npm install (nicht npm ci): der package-lock.json wird auf dem -# Dev-System (Windows) generiert und markiert die linux-musl-arm64-Prebuilts -# von sharp als "dev": true, sodass npm ci sie nicht installiert. npm install -# resolvt Optional-Deps frisch fuer die aktuelle Plattform (= linux-arm64-musl -# im Docker-Build) und findet die Prebuilts korrekt. Die package.json-semver- -# Ranges sorgen fuer hinreichende Reproduzierbarkeit. -RUN npm install --include=optional --no-audit --no-fund +# Zwei Fallstricke werden hier adressiert: +# (a) Der auf Windows erzeugte package-lock.json markiert die linux-musl- +# arm64-Prebuilts von sharp als "dev": true, weshalb npm ci sie selbst +# mit --include=optional nicht installiert. --> npm install statt ci. +# (b) Parallel-Install laesst sharp's postinstall laufen, bevor das +# @img/sharp-linuxmusl-arm64-Paket entpackt ist. --> --ignore-scripts +# hier, dann npm rebuild mit allen Deps auf Disk. node-addon-api ist +# als devDep da, damit der from-source Fallback ebenfalls funktioniert +# (python3 + make + g++ + vips-dev sind oben installiert). +RUN npm install --ignore-scripts --include=optional --no-audit --no-fund +RUN npm rebuild COPY . . RUN npm run build -# Fresh-Install fuer den Runtime-Stage: nur Produktions-Deps, wieder mit -# npm install statt ci aus demselben Grund wie oben. +# Fresh-Install fuer den Runtime-Stage: nur Produktions-Deps, gleicher Ansatz. RUN rm -rf node_modules \ - && npm install --omit=dev --include=optional --no-audit --no-fund + && npm install --ignore-scripts --omit=dev --include=optional --no-audit --no-fund \ + && npm rebuild FROM node:22-alpine AS runner WORKDIR /app diff --git a/package-lock.json b/package-lock.json index 5aee100..aa2231b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "better-sqlite3": "^11.5.0", "linkedom": "^0.18.5", "lucide-svelte": "^1.0.1", + "node-addon-api": "^8.7.0", "yauzl": "^3.3.0", "zod": "^3.23.8" }, @@ -3494,6 +3495,15 @@ "node": ">=10" } }, + "node_modules/node-addon-api": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz", + "integrity": "sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", diff --git a/package.json b/package.json index 8f1c8b8..3241954 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "better-sqlite3": "^11.5.0", "linkedom": "^0.18.5", "lucide-svelte": "^1.0.1", + "node-addon-api": "^8.7.0", "yauzl": "^3.3.0", "zod": "^3.23.8" }