如何使用sharp.js lib在Docker中运行node.js时修复“无效指令”错误

分享于2022年07月17日 docker node.js sharp 问答
【问题标题】:如何使用sharp.js lib在Docker中运行node.js时修复“无效指令”错误(how to fix "invalid instruction" error when running node.js in Docker, with sharp.js lib)
【发布时间】:2022-01-25 23:44:18
【问题描述】:

在 Docker 中运行 node.js 时,使用 sharp.js lib 我收到“无效指令”错误,并以代码 1 退出。

这可能与sharp.js使用的“libvips”有关, 这需要C编译器。 我尝试使用各种基本 Docker 映像,但到目前为止都得到相同的错误。任何建议都会有所帮助。

这是最小可重现集:

const sharp = require("sharp"); 被注释掉时,它会起作用。

当它被包含时,得到这个错误 Illegal instruction

Dockerfile

FROM node
RUN mkdir /app
WORKDIR /app
COPY . ./
RUN npm install
EXPOSE 4004
CMD ["node", "test.js"]

test.js

const app = require("express")();
const sharp = require("sharp");

app.get("/", (req, res) => {
  res.send(`time: ${new Date()}`);
});

app.listen(4004, () => console.log(`listening on port 4004`));

package.json

{
  "dependencies": {
    "axios": "^0.24.0",
    "express": "^4.17.1",
    "fast-csv": "^4.1.1",
    "pdfkit": "^0.13.0",
    "sharp": "^0.29.3"
  },
  "devDependencies": {
    "nodemon": "^2.0.15"
  }
}

构建容器镜像:

docker build -t test .

开始交互式测试:

docker run -d --name test test tail -f /dev/null
docker exec -it test sh

然后 node test.js

当需要“sharp.js”时,得到错误 Illegal instruction ,否则不会。

cmets 建议在使用“alpine”基础映像时可能会发生这种情况,但在这种情况下,其他 node.js Docker 映像也会发生这种情况。

希望这能让它更清楚一点。

相同的清晰库和代码没有容器之外没有问题。

  • 首先,提取 minimal reproducible example 。如果你只是在运行一些软件,那也不会使它成为一个编程问题,但更适合一个错误报告。

【解决方案1】:

此问题与当前版本的 sharp.js 库使用的 CPU 指令有关,某些旧处理器不支持这些指令。通过设置确切的旧版本的sharp.js lib来解决,基于这个有用的答案:

NodeJS: Illegal instruction (core dumped) Error after using sharp library

这个问题解决了

npm i sharp@0.27.2 --save-exact

有趣:它现在可以与 FROM node FROM node:slim 甚至 FROM node:lts-alpine 一起使用,但 FROM node:alpine 支持的,它报告缺少 Python。不过, lts-alpine 还是很小的。

希望此信息对其他人也有用。