簡體   English   中英

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

[英]Docker + node.js: can't spawn phantomjs (ENOENT)

我正在運行一個 node.js 應用程序,它使用html-pdf模塊,該模塊又依賴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"]

這可以很好地構建圖像。

應用程序.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 build 失敗,因為html-pdf的安裝無法驗證phantomjs的安裝)

我顯然也不喜歡使用 npm install 的--unsafe-perms參數,所以如果有人有一個允許繞過它的解決方案,那就太棒了。

任何幫助是極大的贊賞!

這就是最終對我有用的東西,以防這對任何人都有幫助:

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"]

我有一個類似的問題,對我來說唯一的解決方法是手動下載和復制幻影。 這是我來自 docker 文件的示例,它應該是 EXPOSE 命令之前的最后一件事。 順便說一句,我使用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

不要忘記更新您的路徑。 這只是解決方法,我還沒有時間弄清楚。

我在 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" ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM