Docker + node.js:无法生成phantomjs(ENOENT)

时间:2019-07-16 19:01:08

标签: node.js docker phantomjs

我正在运行一个使用html-pdf模块的node.js应用程序,该模块又依赖于phantomjs从HTML生成PDF文件。该应用程序与Docker容器一起运行。

Dockerfile:

FROM node:8-alpine

WORKDIR /mydirectory
# [omitted] git clone, npm install etc....

RUN npm install -g html-pdf --unsafe-perm
VOLUME /mydirectory

ENTRYPOINT ["node"]

可以很好地构建图像。

app.js

const witch = require('witch');
const pdf = require('html-pdf');
const phantomPath = witch('phantomjs-prebuilt', 'phantomjs');

function someFunction() {
  pdf.create('some html content', { phantomPath: `${this._phantomPath}` });
}

// ... and then some other stuff that eventually calls someFunction()

然后致电docker run <the image name> app.js

调用someFunction时,会引发以下错误消息:

Error: spawn /mydirectory/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs ENOENT

在将容器部署在云linux服务器上或在我的计算机上本地部署时都会发生这种情况。

我尝试将RUN npm install -g phantomjs-prebuilt --unsafe-perms添加到Dockerfile中无济于事(这使docker构建失败,因为html-pdf的安装无法验证phantomjs的安装)

我显然也不喜欢使用npm install的--unsafe-perms参数,因此,如果有人可以绕过该解决方案,那就太好了。

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

我有一个类似的问题,对我来说,唯一的解决方法是手动下载和复制幻像。这是我来自docker文件的示例,应该排在EXPOSE comand之前。顺便说一句,我使用的是node:10.15.3图片。

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 /tmp/phantomjs && 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

别忘了更新您的路径。这只是解决方法,我还没有时间弄清楚。

答案 1 :(得分:0)

如果对任何人有帮助,这就是最终为我工作的原因:

FROM node:8-alpine

WORKDIR /mydirectory
# [omitted] git clone, npm install etc....

ENV PHANTOMJS_VERSION=2.1.1
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
ENV PATH=$PATH:/home/node/.npm-global/bin
RUN apk update && apk add --no-cache fontconfig curl curl-dev && \
    cd /tmp && curl -Ls https://github.com/dustinblackman/phantomized/releases/download/${PHANTOMJS_VERSION}/dockerized-phantomjs.tar.gz | tar xz && \
    cp -R lib lib64 / && \
    cp -R usr/lib/x86_64-linux-gnu /usr/lib && \
    cp -R usr/share /usr/share && \
    cp -R etc/fonts /etc && \
    curl -k -Ls https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-${PHANTOMJS_VERSION}-linux-x86_64.tar.bz2 | tar -jxf - && \
    cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs

USER node
RUN npm install -g html-pdf

VOLUME /mydirectory

ENTRYPOINT ["node"]

答案 2 :(得分:0)

我在 2021 年 3 月遇到了这个问题,并且在 dockerizing highcharts 时遇到了同样的问题:它在我的机器上运行但在 docker run 上失败(同样的 spawn phantomjs 错误)。最后,解决方案是找到一个有效的 FROM 节点版本。这个 Dockerfile 使用最新的 Node docker 镜像和几乎最新的 highcharts npm 版本(总是选择特定的 npm 版本):

FROM node:15.12.0

ENV ACCEPT_HIGHCHARTS_LICENSE YES

# see available versions of highcharts at https://www.npmjs.com/package/highcharts-export-server
RUN npm install highcharts-export-server@2.0.30 -g

EXPOSE 7801

# run the container using: docker run -p 7801:7801 -t CONTAINER_TAG
CMD [ "highcharts-export-server", "--enableServer", "1" ]