Je to způsobeno tím, že spustíte docker
na platformě Linux a váš počítač je pravděpodobně mac nebo windows. Většinu času můžete použít stejné verze modulu, ale ne, když používá nízkoúrovňové funkce jádra jako sharp
.
Potřebujete jinou verzi Sharp na Dockeru a na vašem místním počítači.
Pravděpodobně jste svůj projekt spustili bez dockeru, pak s ukotvovačem.
Řešení 1: Můžete odstranit složku package.lock + node_modules, poté znovu sestavit a nyní používat pouze docker.
Řešení 2: (není čisté, ale může pomoci) Odebrat Sharp z vašeho package.json a nainstalujte jej později při spuštění serveru. Například aktualizací souboru package.json:
package.json
{
...
"scripts": {
...
"start-docker": "yarn add sharp && nodemon index.js"
},
...
můžete to udělat také v souboru 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"]
Čelil jsem problému s vícestupňovým souborem dockeru, kde jsou dva obrázky založeny na různých platformách, a vyřešil jsem to takto:
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"]
Trik je v instalaci run npm install sharp
ve finálním kontejneru - v mém případě to byl Alpine linux, který se liší od základního obrazu node:14 (samozřejmě je to jiná platforma). Sharp je kompilován přímo na určitou platformu, takže běží npm install
v jednom kontejneru a kopírování těchto zkompilovaných / předkompilovaných souborů do jiného kontejneru nemůže fungovat. Předpokládám, že je to stále lepší řešení než návrat k obrazu node:14 (pouze spustit kontejner), který je mnohem větší (v mém případě 1,4Gb -> 0,7Gb Alpine).
Mějte na paměti, že byste stále měli mít soubor .dockeringore s node_modules, který vám tento problém nepomůže. Pouze urychluje vytváření procesů pomocí mezipaměti na serveru CI nebo na místním hostiteli (s různými OS).
Na zdraví
Setkal jsem se se stejnou chybou s Dockerem. Problém byl v tom, že jsem zapomněl uvést .dockerignore
soubor a můj node_modules
byly kopírovány do kontejneru.
Zkuste vytvořit .dockerignore
soubor v kořenovém adresáři vašeho projektu (vedle vašeho Dockerfile) s např.:
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore