docker
を実行したことが原因です Linux プラットフォームで、マシンはおそらく mac または windows です。ほとんどの場合、同じモジュール バージョンを使用できますが、sharp
のような低レベルのカーネル関数を使用する場合は使用できません。 .
Sharp の別のバージョンが必要です Docker とローカル マシンで。
おそらく、docker を使用せずにプロジェクトを実行してから、docker を使用して実行したことでしょう。
解決策 1: package.lock + node_modules フォルダーを削除して再構築し、docker のみを使用することができます。
解決策 2: (きれいではありませんが、役に立ちます)シャープを削除します package.json からダウンロードし、後でサーバーを起動するときにインストールします。たとえば、package.json を更新することにより:
package.json
{
...
"scripts": {
...
"start-docker": "yarn add sharp && nodemon index.js"
},
...
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"]
2 つのイメージが異なるプラットフォームに基づいているマルチステージドッカー ファイルの問題に直面し、次のように解決しました:
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"]
トリックは run npm install sharp
をインストールすることです 最終的なコンテナ - 私の場合、node:14 の基本イメージとは異なるのは Alpine Linux でした (明らかに異なるプラットフォームです)。 Sharp は特定のプラットフォームに直接コンパイルされるため、npm install
を実行します 1 つのコンテナーでコンパイル済み/プリコンパイル済みファイルを別のコンテナーにコピーすることはできません。これは、はるかに大きい node:14 イメージ (コンテナのみを実行) にフォールバックするよりも優れたソリューションであると思います (私の場合は 1.4Gb -> 0.7Gb Alpine)。
node_modules を含む .dockeringore ファイルは、この問題の解決には役立たないことに注意してください。 CI サーバーまたはローカルホスト (OS が異なる) 上のキャッシュを使用して、プロセスの構築を高速化するだけです。
乾杯
Docker で同じエラーに直面しました。問題は、.dockerignore
を含めるのを忘れていたことです。 ファイルと私の node_modules
コンテナにコピーされていました。
.dockerignore
を作成してみてください プロジェクトのルート (Dockerfile の隣) に次のようなファイルを作成します:
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore