在 AWS Lambda 函数中运行 Sharp 时出错:无法在“linux-x64”平台上使用 darwin-x64' 二进制文件

Kei*_*ris 12 aws-lambda sharp macos-mojave

当尝试在 AWS Lambda 函数内运行时,我不断收到以下错误:

darwin-x64' 二进制文件不能在 'linux-x64' 平台上使用。请删除“node_modules/sharp/vendor”目录并运行“npm install”

我使用 MacBook Pro 中的无服务器框架部署了无服务器应用程序。我该如何解决这个问题?

Kei*_*ris 24

stdunbar 致敬的转向我在正确的方向。

当通过 NPM 以正常方式(即:)在 MacOS 上安装夏普时npm i sharp --save,安装程序会自动为 OS X 添加二进制文件。但 AWS lambda 函数在具有 x64 处理器的 Linux 2 机器上运行,这就是我们收到此错误的原因。

要修复您必须首先完全卸载sharp然后运行:

npm install --arch=x64 --platform=linux sharp
Run Code Online (Sandbox Code Playgroud)

笔记:

0.25 版不再与目标标志一起使用。这曾经有效:

npm install --arch=x64 --platform=linux --target=10.15.0 sharp
Run Code Online (Sandbox Code Playgroud)

然后像往常一样从无服务器框架部署 sls deploy

边注:

夏普非常快!!!在使用sharp之前,我使用了另一个名为Jimp的图像大小调整实用程序。它完成了工作,但速度很慢。为了防止超时错误,我不得不将内存大小从 128 增加到 512,并将超时从 5 秒增加到 30 秒,以处理典型的 1 兆字节图像。

这是使用相同配置将 1.2Mb 图片缩小到 600x400 的两者之间的比较:

Jimp -> 使用了 512Mb 的内存,AWS 向我收取了 14300 毫秒的费用。

Sharp -> 使用了 132 MB 的内存,AWS 向我收取了 800 毫秒的费用。

这比 Jimp 快 14 倍多!!!


Mun*_*nib 6

如果你像我一样使用 Docker 并遇到这个问题。

您的文件夹很可能node_modules从主机复制到 docker 容器中。

为什么?因为您的node_modules文件夹下载特定于您的计算机架构(在我的情况下是 Mac)的模块,所以当您获取这些包并尝试在容器操作系统中运行它们时,它会导致问题,因为二进制文件适用于 mac (darwin-x64) 并且它尝试在容器内的 linux (linux-x64) 上运行它们

.dockerignore要修复此问题,请在与您的目录相同的目录中创建一个名为的文件Dockerfile并进行相应更新。

.dockerignore

node_modules/
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM node:latest
WORKDIR /usr/src/app
COPY package*.json ./
RUN ["npm", "install"]
COPY . .
CMD ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)

现在,它将忽略node_modules主机上的文件夹,并在npm installDockerfile 内的命令运行后重新填充模块。