linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误
Posted
技术标签:
【中文标题】linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误【英文标题】:linux-x64 binaries cannot be used on the linuxmusl-x64 platform error 【发布时间】:2020-01-15 20:31:46 【问题描述】:我正在为带有 package.json 的 Nodejs 项目的 docker 映像安装 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 映像,但我仍然收到错误。
感谢任何有关如何解决此问题的建议。
【问题讨论】:
你可以粘贴到你的控制台输出而不是发布屏幕截图吗?谢谢! @GeneZ.Ragan 我贴了。 太棒了。您现在可以删除图片了! 您究竟是如何构建和运行映像的? (对于我习惯的标准 Docker 工作流程,您需要在 Dockerfile 中添加RUN npm install
,确保 node_modules
目录在 .dockerignore
文件中列出,并且您不应该有任何 docker run -v
选项隐藏或以其他方式覆盖图像中的代码。)
@DavidMaze 我正在使用docker-compose
构建映像并运行它,同样在Dockerfile 中,我使用了Run npm install
命令;我删除了图像并重新构建了它,Sharp包安装成功,没有任何错误,但是当我运行容器时,出现上述错误!我还没有.dockerignore
文件!是否会导致此错误?
【参考方案1】:
这是由于您在 Linux 平台上运行 docker
并且您的机器可能是 mac 或 windows 造成的。大多数时候你可以使用相同的模块版本,但当它使用像sharp
这样的低级内核函数时就不行了。
您需要在 Docker 和本地计算机上使用不同版本的 Sharp。
您可能已经在没有 docker 的情况下运行了您的项目,然后使用了 docker。
解决方案 1: 您可以删除 package.lock + node_modules 文件夹,然后重新构建,现在只使用 docker。
解决方案 2:(不干净但可以提供帮助) 从 package.json 中删除 Sharp 并在稍后启动服务器时安装它。例如通过更新你的 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"]
【讨论】:
你的意思可能是package-lock.json
【参考方案2】:
我在使用 Docker 时遇到了同样的错误。问题是我忘记包含 .dockerignore
文件,而我的 node_modules
被复制到容器中。
尝试在项目的根目录(在 Dockerfile 旁边)创建一个 .dockerignore
文件,例如:
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
【讨论】:
这也为我解决了这个问题。谢谢你。应该是公认的答案。【参考方案3】:我遇到了多阶段 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"]
诀窍是在最终容器中安装 run npm install sharp
- 在我的情况下,它是 Alpine linux,它与 node:14 的基本映像不同(显然它是不同的平台)。 Sharp 直接编译到特定平台,因此在一个容器中运行 npm install
并将那些已编译/预编译的文件复制到另一个容器无法正常工作。我认为这仍然是更好的解决方案,然后回退到更大的节点:14 图像(仅运行容器)(在我的情况下为 1,4Gb -> 0.7Gb Alpine)。
请记住,您仍然应该拥有带有 node_modules 的 .dockeringore 文件并不能帮助您解决此问题。它只是通过 CI 服务器或 localhost(使用不同的操作系统)上的缓存来加速进程构建。
干杯
【讨论】:
以上是关于linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误的主要内容,如果未能解决你的问题,请参考以下文章
错误:darwin-x64' 二进制文件不能在 'linux-x64' 平台上使用(AWS lambda + typescript + webpack sharp 模块)
CentOS7.2通用二进制格式安装mariadb-5.5.46-linux-x86_64.tar.gz文档与启动时失败排查分析