node.js - Docker 中的 Nodejs + PhantomJS:错误:spawn - ENOENT
问题描述
我正在开发一个使用 的 Node.js 应用程序html-pdf
,它PhantomJS
在创建给定html
字符串的 pdf 文件时使用。
一切正常,但是当我想在 中构建应用程序时Docker
,会发生此错误:
ERROR: Error: spawn /usr/src/app/node_modules/phantomjs-prebuilt/lib/phantom\bin\phantomjs.exe ENOENT
events.js:291
throw er; // Unhandled 'error' event
Error: write EPIPE
at afterWriteDispatched (internal/stream_base_commons.js:156:25)
at writeGeneric (internal/stream_base_commons.js:147:3)
at Socket._writeGeneric (net.js:785:11)
at Socket._write (net.js:797:8)
at writeOrBuffer (_stream_writable.js:352:12)
at Socket.Writable.write (_stream_writable.js:303:10)
at PDF.PdfExec [as exec] (/usr/src/app/node_modules/html-pdf/lib/pdf.js:141:15)
at PDF.PdfToFile [as toFile] (/usr/src/app/node_modules/html-pdf/lib/pdf.js:83:8)
at /usr/src/app/src/createPDF.js:87:42
at FSReqCallback.readFileAfterClose [as oncomplete] (internal/fs/read_file_context.js:63:3)
Emitted 'error' event on Socket instance at:
at emitErrorNT (internal/streams/destroy.js:100:8)
at emitErrorCloseNT (internal/streams/destroy.js:68:3)
at processTicksAndRejections (internal/process/task_queues.js:80:21) {
errno: -32,
code: 'EPIPE',
syscall: 'write'
}
这是Dockerfile
我正在使用的:
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN npm install --production
RUN wget -O /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz2 https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
RUN mkdir -p /usr/local/lib/node_modules/phantomjs/lib/phantom/
RUN tar xvjf /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /tmp/phantomjs
RUN mv /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64/* /usr/local/lib/node_modules/phantomjs/lib/phantom/
RUN rm -rf /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz && rm -rf /tmp/phantomjs
EXPOSE 8080
CMD ["npm","run","serve"]
我不想手动安装PhantomJS
,但这是我在网上找到的唯一解决方案。
我还查看了其他问题并尝试在选项中传递path
ofphantom
但没有奏效。
解决方案
对于将来遇到此问题的任何人,以下是我设法解决此问题的方法:
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN npm install --production
RUN npm install -g phantomjs --unsafe-perm
EXPOSE 8080
CMD ["npm","run","serve"]
phantomjs
然后使用选项传递全局路径requireg
:
var options = { phantomPath: require('requireg')('phantomjs').path }
推荐阅读
- google-sheets - 如何比较多个列聚合与 Google 表格中这些列相关的值
- vba - XML解析循环期间访问表更新缓慢 - VBA
- javascript - 如何比较 for...of 循环中的索引?
- java - 扩展 ListFactoryBean 是否会创建仅引用父级的列表的新副本?
- llvm - 将 LLVM IR 分析与最终地址相关联
- java - NetBeans GUI 设计器未显示组件
- javascript - 为长度为“0”的元组类型“[]”构建角度项目时出错,索引“0”处没有元素
- regex - 正则表达式获取多个非 kebab-case 样式的字符串
- c++ - 更改为 std::vector 导致分段错误
- python - 每 x 分钟发送一次 api 请求并使用状态更新上下文