Es wird dadurch verursacht, dass Sie docker
ausführen auf einer Linux-Plattform und Ihr Computer ist wahrscheinlich Mac oder Windows. Meistens können Sie dieselben Modulversionen verwenden, aber nicht, wenn es Low-Level-Kernelfunktionen wie sharp
verwendet .
Sie benötigen eine andere Version von Sharp auf Docker und auf Ihrem lokalen Rechner.
Wahrscheinlich haben Sie Ihr Projekt ohne Docker ausgeführt, dann mit Docker.
Lösung 1: Sie können den Ordner package.lock + node_modules entfernen, dann neu erstellen und jetzt nur Docker verwenden.
Lösung 2: (nicht sauber, kann aber helfen) Entferne Sharp von Ihnen package.json und installieren Sie es später, wenn Sie Ihren Server starten. Zum Beispiel durch Aktualisieren Ihrer package.json:
Paket.json
{
...
"scripts": {
...
"start-docker": "yarn add sharp && nodemon index.js"
},
...
Sie können dies auch in Ihrer Dockerfile-Datei tun:
Dockerfile
FROM node:13
ADD package.json /package.json
RUN yarn install
RUN yarn add sharp
ENV NODE_PATH=/node_modules
ENV PATH=$PATH:/node_modules/.bin
WORKDIR /app
CMD ["yarn","start-docker"]
Ich hatte das Problem mit einer mehrstufigen Docker-Datei, bei der die beiden Bilder auf verschiedenen Plattformen basieren, und ich habe es so gelöst:
FROM node:14 AS builder
WORKDIR /app
COPY ./package.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app ./
RUN npm install sharp
CMD ["npm", "run", "start:prod"]
Der Trick besteht darin, den Lauf npm install sharp
zu installieren im letzten Container - in meinem Fall war es Alpine Linux, das sich vom Basis-Image von node:14 unterscheidet (offensichtlich ist es eine andere Plattform). Sharp wird direkt für bestimmte Plattformen kompiliert, sodass npm install
ausgeführt wird in einem Container zu speichern und diese kompilierten/vorkompilierten Dateien in einen anderen Container zu kopieren, kann nicht funktionieren. Ich gehe davon aus, dass dies immer noch eine bessere Lösung ist als ein Fallback auf das Node:14-Image (nur Container ausführen), das viel größer ist (in meinem Fall 1,4 GB -> 0,7 GB Alpine).
Denken Sie daran, dass Sie immer noch eine .dockeringore-Datei mit node_modules haben sollten, die Ihnen nicht hilft, dieses Problem zu lösen. Es beschleunigt lediglich die Prozesserstellung mit Cache auf dem CI-Server oder auf dem lokalen Host (mit unterschiedlichen Betriebssystemen).
Prost
Ich hatte den gleichen Fehler mit Docker. Das Problem war, dass ich vergessen habe, einen .dockerignore
einzufügen Datei und mein node_modules
wurden in den Container kopiert.
Versuchen Sie, einen .dockerignore
zu erstellen Datei im Stammverzeichnis Ihres Projekts (neben Ihrem Dockerfile) mit z. B.:
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore