[英]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.