如何在 Docker 中使用 sharp.js lib 修复 运行 node.js 时的 "invalid instruction" 错误
how to fix "invalid instruction" error when running node.js in Docker, with sharp.js lib
当 运行 node.js 在 Docker 中时,使用 sharp.js lib 我收到“无效指令”错误,它以代码 1 退出。
这可能与 sharp.js 使用的“libvips”有关,
这需要 C 编译器。
我尝试使用各种基础 Docker 图像,到目前为止都得到相同的错误。任何建议都会有所帮助。
这是最小可复现集:
当 const sharp = require("sharp");
被注释掉时它有效。
包含时出现此错误Illegal instruction
Docker文件
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
否则不会。
评论表明,当使用“alpine”基础图像时可能会发生这种情况,但在这种情况下,其他 node.js Docker 图像也会发生这种情况。
希望这能让它更清楚一些。
没有容器外部的相同清晰的库和代码没有问题。
此问题与当前版本 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
不 [=28] =] 支持,它报告缺少 Python。尽管如此,lts-alpine
还是很小。
希望此信息对其他人也有用。
当 运行 node.js 在 Docker 中时,使用 sharp.js lib 我收到“无效指令”错误,它以代码 1 退出。
这可能与 sharp.js 使用的“libvips”有关, 这需要 C 编译器。 我尝试使用各种基础 Docker 图像,到目前为止都得到相同的错误。任何建议都会有所帮助。
这是最小可复现集:
当 const sharp = require("sharp");
被注释掉时它有效。
包含时出现此错误Illegal instruction
Docker文件
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
否则不会。
评论表明,当使用“alpine”基础图像时可能会发生这种情况,但在这种情况下,其他 node.js Docker 图像也会发生这种情况。
希望这能让它更清楚一些。
没有容器外部的相同清晰的库和代码没有问题。
此问题与当前版本 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
不 [=28] =] 支持,它报告缺少 Python。尽管如此,lts-alpine
还是很小。
希望此信息对其他人也有用。