linux-x64 二进制文件不能在 linuxmusl-x64 平台错误上使用

linux-x64 binaries cannot be used on the linuxmusl-x64 platform error

我正在为 package.json 的 Nodejs 项目的 docker 图像安装 Sharp 图像压缩包。 当我创建容器时,出现以下关于 sharp 包的错误:

/app/node_modules/sharp/lib/libvips.js:67 
throw new Error(`'${vendorPlatformId}' binaries cannot be used on the '${currentPlatformId}' platform. Please remove the 'node_modules/sharp/vendor' directory and run 'npm install'.`);
 ^ Error: 'linux-x64' binaries cannot be used on the 'linuxmusl-x64' platform. Please remove the 'node_modules/sharp/vendor' directory and run 'npm install'.
at Object.hasVendoredLibvips (/app/node_modules/sharp/lib/libvips.js:67:13)
at Object.<anonymous> (/app/node_modules/sharp/lib/constructor.js:8:22)
at Module._compile (module.js:577:32) 
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32) 
at tryModuleLoad (module.js:453:12) 
at Function.Module._load (module.js:445:3) 
at Module.require (module.js:504:17) 
at require (internal/module.js:20:19) 
at Object.<anonymous> (/app/node_modules/sharp/lib/index.js:3:15)'.

我已经删除了整个 node_module 目录并在目录中重新运行 npm install 命令以重新安装所有包并重建了 docker 图像,但我仍然收到错误.

如有任何关于如何解决此问题的建议,我们将不胜感激。

这是因为您 运行 docker 在 Linux 平台上并且您的 mac 可能是 mac 或 windows .大多数时候你可以使用相同的模块版本,但当它使用像 sharp.

这样的低级内核函数时就不行了。

您需要在 Docker 和本地 machine 上使用不同版本的 Sharp

您的项目可能 运行 没有 docker,然后 docker。

解决方案一: 您可以删除 package.lock + node_modules 文件夹然后重建,现在只使用 docker.

解决方案2:(不干净但有帮助) 从 package.json 中删除 Sharp 并稍后在启动服务器时安装它。例如,通过更新您的 package.json:

package.json

{
  ...
  "scripts": {
    ...
    "start-docker": "yarn add sharp && nodemon index.js"
  },
  ...

您也可以在 Dockerfile 文件中执行此操作:

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"]

我遇到了与 Docker 相同的错误。问题是我忘记包含一个 .dockerignore 文件并且我的 node_modules 被复制到容器中。

尝试在项目的根目录中创建一个 .dockerignore 文件(在 Docker 文件旁边),例如:

node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore

我遇到了多阶段 docker 文件的问题,其中两个图像基于不同的平台,我是这样解决的:

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"]

诀窍是在最终容器中安装 运行 npm install sharp - 在我的例子中它是 Alpine linux 与 node:14 的基本图像不同(显然它是不同的平台)。 Sharp 直接编译到特定平台,因此 运行ning npm install 在一个容器中并将那些编译/预编译文件复制到另一个容器是行不通的。我认为这仍然是更好的解决方案,然后回退到更大的 node:14 图像(仅 运行 容器)(在我的例子中是 1,4Gb -> 0.7Gb Alpine)。

请记住,您应该仍然拥有带有 node_modules 的 .dockeringore 文件不会帮助您解决此问题。它只是通过 CI 服务器或本地主机(具有不同的 OS)上的缓存加速进程构建。

干杯