千萬不要在docker中用phantomjs來截圖


工作上需要一個臨時的排行榜,本來是要人手每天更新

但想到了一個很HACK的作法:

運行一個webserver,利用html + css製作一個臨時的排行榜 之後運行phantomjs製作一張螢幕截圖,再把圖片upload上s3並更新服務器位址

之前有用過phantomjs製作截圖,覺得整體上可行性甚高 亦因此開始了痛苦的踩坑之旅…

實作

在mac環境下很快就把程序寫好,簡單的nodejs+aws-sdk+phantomjs 滿心歡喜的準備把它dockerize,然後惡夢就來了

問暝一. 權限

首先出現的是docker安裝不了phantomjs 本身用的是node-alphine的image,用npm安裝的phantomjs binary路徑會出錯 而用phantomjs-prebuilt的話則權限會出現問題https://github.com/Medium/phantomjs/issues/707

搞了半天最後屈服,直接用ubuntu的base image再安裝nodejs + phantomjs就算了

FROM ubuntu:trusty

# PhantomJS
RUN apt-get install -y libfreetype6 libfontconfig
RUN apt-get install -y wget
RUN wget -q https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
RUN tar xjf phantomjs-2.1.1-linux-x86_64.tar.bz2
RUN install -t /usr/local/bin phantomjs-2.1.1-linux-x86_64/bin/phantomjs
RUN rm -rf phantomjs-2.1.1-linux-x86_64
RUN rm phantomjs-2.1.1-linux-x86_64.tar.bz2

好了終於跑起來沒問題了,圖片亦都成功upload到s3…… 咦,圖片好像有點不對勁 圖片上的中文全部變成空格了!!

問題二. 中文字

ubuntu的image本身就沒中文字型 所以要把字型都安裝一下(也要挑個好看的字型 … )

# install chinese fonts for ubuntu
RUN echo "deb http://gce\_debian\_mirror.storage.googleapis.com wheezy contrib non-free" >> /etc/apt/sources.list \
  && echo "deb http://gce\_debian\_mirror.storage.googleapis.com wheezy-updates contrib non-free" >> /etc/apt/sources.list \
  && echo "deb http://security.debian.org/ wheezy/updates contrib non-free" >> /etc/apt/sources.list
RUN apt-get update

RUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula \
    select true | debconf-set-selections

RUN apt-get install -y language-pack-zh-hant && \
    apt-get install -y --force-yes ttf-mscorefonts-installer

RUN apt-get install fonts-cwtex-heib
#fonts-cwtex-kai fonts-cwtex-docs fonts-cwtex-ming

# Renew the font cache
RUN apt-get install -y fontconfig
RUN fc-cache -fv

跑起來沒問題,給美術看下效果圖 她第一個反應是英文的字體為什麼這樣難看…

問題三. 英文字型

好吧 因為mac上用的是Helvetica.. ubuntu上當然沒有啦 加進去就好

RUN mkdir -p /usr/share/fonts/truetype/helvetica
COPY ./helvetica /usr/share/fonts/truetype/helvetica

# Renew the font cache
RUN apt-get install -y fontconfig
RUN fc-cache -fv

這次應該再沒問題吧…… 抱歉,名字是有emoji的

問題四. emoji支援

好吧.. 其實ubuntu 也有 support emoji 的!

# Add emoji support
RUN add-apt-repository ppa:eosrei/fonts
RUN apt update && sudo apt install -y fonts-emojione-svginot

但這次跑是跑起來,emoji也有,但竟然他X的是空心的!

問題五. emoji字型

ubuntu版的emoji font 只有用firefox (或者Gecko-based browser)才會有顏色 而phantomjs是用webkit作為底層的,所以看到的emoji只有外框

夠了,我放棄

最後也懶得再找phantomjs 的替代品(好吧其實是有的https://slimerjs.org/) 只好不deploy,直接在本機上跑就是了(反正是HACK我不管)

結論

如果你是用phatomjs來跑一些測試的話其實在docker上也沒有很多問題 但這次的CASE比較特別,要在ubuntu上面跑phantomjs來截圖 出來的效果當然跟MAC/PC上的差很遠 所以要有emoji/中文support的話真的要三思