基础环境是 alpine-node:6,要把 Phantomjs 部署到该服务器上,发现直接在 package.json 里加上 phantomjs-prebuilt 的依赖是不能运行的。

网络搜了一轮,发现是 Phantomjs 在 alpine linux 上是有问题的,找到这个 issue,尝试把下面这段加到 Dockerfile 里:

RUN apk update && apk add --no-cache fontconfig curl curl-dev && \
    mkdir -p /usr/share && \
    cd /usr/share \
    && curl -L https://github.com/Overbryd/docker-phantomjs-alpine/releases/download/2.11/phantomjs-alpine-x86_64.tar.bz2 | tar xj \
    && ln -s /usr/share/phantomjs/phantomjs /usr/bin/phantomjs \
    && phantomjs --version

的确在加入这段之后,它能找到 phantomjs 了,但是执行 createPage 的操作时并不返回,不清楚是不是哪个 package 里的 bug,打开 debug 之后,发现 send 事件之后是没有 receive 事件的,NOOP command 也仅仅发送一次,也就是说 phantomjs 没有收到命令,或者收到了没有反应。由于缺乏上下文,不清楚网上其它人是怎么能跑起来的,没办法,只好另寻它路。

然后搜到这个代码片段,它里面是使用了 phantomized,试了一下这段代码:

# 2: Download+Install PhantomJS, as the npm package 'phantomjs-prebuilt' won't work on alpine!
# See https://github.com/dustinblackman/phantomized
RUN set -ex \
  && apk add --no-cache --virtual .build-deps ca-certificates openssl \
  && wget -qO- "https://github.com/dustinblackman/phantomized/releases/download/2.1.1/dockerized-phantomjs.tar.gz" | tar xz -C / \
  && npm install -g phantomjs \
  && apk del .build-deps

这次终于能运行了。