È causato dal fatto che esegui docker
su una piattaforma Linux e la tua macchina è probabilmente Mac o Windows. La maggior parte delle volte puoi usare le stesse versioni del modulo ma non quando usa funzioni del kernel di basso livello come sharp
.
Hai bisogno di una versione diversa di Sharp su Docker e sul tuo computer locale.
Probabilmente hai eseguito il tuo progetto senza docker, quindi con docker.
Soluzione 1: Puoi rimuovere la cartella package.lock + node_modules, quindi ricostruire e ora utilizzare solo la finestra mobile.
Soluzione 2: (non pulito ma può aiutare)Rimuovi Sharp da te package.json e installalo successivamente quando avvii il tuo server. Ad esempio aggiornando il tuo package.json:
pacchetto.json
{
...
"scripts": {
...
"start-docker": "yarn add sharp && nodemon index.js"
},
...
puoi farlo anche nel tuo file Dockerfile:
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"]
Ho affrontato il problema con il file docker multistadio in cui le due immagini sono basate su piattaforme diverse e l'ho risolto in questo modo:
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"]
Il trucco è installare run npm install sharp
nel contenitore finale - nel mio caso era Alpine Linux che è diverso dall'immagine di base del nodo:14 (ovviamente è una piattaforma diversa). Sharp è compilato direttamente su determinate piattaforme, quindi esegue npm install
in un contenitore e copiare quei file compilati/precompilati in un altro contenitore non può funzionare. Presumo che questa sia una soluzione ancora migliore rispetto al fallback su node:14 image (esegui solo il container) che è molto più grande (nel mio caso 1,4 Gb -> 0,7 Gb Alpine).
Tieni presente che dovresti ancora avere il file .dockeringore con node_modules non ti aiuterà a risolvere questo problema. Accelera solo la costruzione del processo con la cache sul server CI o su localhost (con sistema operativo diverso).
Saluti
Ho riscontrato lo stesso errore con Docker. Il problema è che ho dimenticato di includere un .dockerignore
file e il mio node_modules
venivano copiati nel contenitore.
Prova a creare un .dockerignore
file nella root del tuo progetto (accanto al tuo Dockerfile) con ad esempio:
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore