我正在安装Sharp
软件包,以在带有package.json的Nodejs项目的docker映像上压缩映像。
当我创建容器时,对于尖锐的包装,会出现以下错误:
/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镜像,但是仍然出现错误。
对于如何解决此问题的任何建议,我们深表感谢。
答案 0 :(得分:16)
我在Docker上遇到了同样的错误。问题是我忘了包含一个.dockerignore
文件,而我的node_modules
被复制到了容器中。
尝试在项目的根目录(Dockerfile的旁边)中创建一个.dockerignore
文件,例如:
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
答案 1 :(得分:1)
这是由于您在Linux平台上运行docker
而您的计算机可能是Mac或Windows引起的。在大多数情况下,您可以使用相同的模块版本,但在使用sharp
之类的低级内核函数时则不能。
您需要在Docker和本地计算机上使用其他版本的 Sharp 。
您可能已经在没有docker的情况下运行了项目,然后又有了docker。
解决方案1: 您可以删除package.lock + node_modules文件夹,然后进行重建,现在仅使用docker。
解决方案2:(不干净,但可以提供帮助) 从package.json中删除 Sharp ,并在以后启动服务器时进行安装。例如,通过更新package.json:
{
...
"scripts": {
...
"start-docker": "yarn add sharp && nodemon index.js"
},
...
您也可以在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"]
答案 2 :(得分:1)
我遇到了多阶段 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
并将那些编译/预编译文件复制到另一个容器无法工作。我认为这仍然是更好的解决方案,然后回退到更大的 node:14 图像(仅运行容器)(在我的情况下为 1,4Gb -> 0.7Gb Alpine)。
请记住,您仍然应该拥有带有 node_modules 的 .dockeringore 文件不会帮助您解决此问题。它只是通过 CI 服务器或本地主机(使用不同的操作系统)上的缓存来加速进程构建。
干杯