我正在开发一个使用html-pdf
的Node.js应用程序,该应用程序在创建给定html
字符串的pdf文件时使用PhantomJS
。
一切都很好,但当我想在Docker
中构建应用程序时,会出现以下错误:
ERROR: Error: spawn /usr/src/app/node_modules/phantomjs-prebuilt/lib/phantombinphantomjs.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
,但这是我在网上找到的唯一解决方案。
我也看过其他问题,并试图通过选项中phantom
的path
,但没有成功。
对于未来面临此问题的任何人,以下是我如何解决此问题:
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"]
然后使用requireg
:在选项中传递phantomjs
的全局路径
var options = { phantomPath: require('requireg')('phantomjs').path }
对我来说,它是这样工作的,关键是你必须在docker映像上进行npm安装,在那里你将运行你的应用程序并公开端口!
FROM node:12.18.4 AS dep
ENV PHANTOMJS_VERSION 2.1.1
副本/dist/app/副本/包*.json/app/WORKDIR/app运行npm安装--生产
FROM节点:12.18.4-slimCOPY--发件人=dep/app/appWORKDIR/app
安装phantomjs
RUN apt-get更新
&;apt-get-install-y-不安装建议使用
ca证书
bzip2
fontconfig
libfontconfig
&;易于清理
&;rm-rf/var/lib/apt/lists/*RUN npm安装--生产RUN npm install-g phantomjs预构建-不安全的perm
暴露3000CMD["server.js"]