Cela est dû au fait que vous exécutez docker
sur une plate-forme Linux et votre machine est probablement mac ou windows. La plupart du temps, vous pouvez utiliser les mêmes versions de module, mais pas lorsqu'il utilise des fonctions de noyau de bas niveau comme sharp
.
Vous avez besoin d'une autre version de Sharp sur Docker et sur votre ordinateur local.
Vous avez probablement exécuté votre projet sans docker, puis avec docker.
Solution 1 : Vous pouvez supprimer le dossier package.lock + node_modules puis le reconstruire et n'utiliser plus que docker.
Solution 2 : (pas propre mais peut aider) Supprimer Sharp de votre package.json et installez-le plus tard lorsque vous démarrez votre serveur. Par exemple en mettant à jour votre package.json :
paquet.json
{
...
"scripts": {
...
"start-docker": "yarn add sharp && nodemon index.js"
},
...
vous pouvez également le faire dans votre fichier Dockerfile :
Fichier Docker
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"]
J'ai rencontré le problème avec le fichier docker à plusieurs étapes où les deux images sont basées sur des plates-formes différentes et je l'ai résolu comme ceci :
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"]
L'astuce consiste à installer run npm install sharp
dans le conteneur final - dans mon cas, c'était Alpine Linux qui est différent de l'image de base de node:14 (évidemment, c'est une plate-forme différente). Sharp est compilé directement sur certaines plates-formes, exécutant donc npm install
dans un conteneur et copier ces fichiers compilés/précompilés dans un autre conteneur ne peut pas fonctionner. Je suppose que c'est encore une meilleure solution que de revenir à l'image node:14 (uniquement le conteneur d'exécution) qui est bien plus grande (dans mon cas 1,4 Go -> 0,7 Go Alpine).
Gardez à l'esprit que vous devriez toujours avoir le fichier .dockeringore avec node_modules ne vous aidera pas à résoudre ce problème. Il accélère simplement la création de processus avec un cache sur le serveur CI ou sur localhost (avec un système d'exploitation différent).
Bravo
J'ai rencontré la même erreur avec Docker. Le problème était que j'avais oublié d'inclure un .dockerignore
fichier et mon node_modules
étaient en cours de copie dans le conteneur.
Essayez de créer un .dockerignore
à la racine de votre projet (à côté de votre Dockerfile) avec par exemple :
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore