Dockerを使って、AWS Lambda用のPhantomJSとfontconfigをビルドする

dockerを使ってみる。 やりたいことはこれ

AWS LambdaでPhantomJSを使ってあれこれしたいけど、日本語フォントを扱えるようにしないと、キャプチャがうまくできない。 日本語フォントを扱える夜にするのはリクルートさんの記事のとおりにできるけど、じゃあそのためのfontconfigのビルドは?

さらに、npmのphantomjs(現在はphantomjs-prebuilt)macの環境でインストールしてしまうと、lambdaの環境では動かない。

ということで、Linux環境であれこれして、Lambda用のパッケージのビルドする。

そのための簡易環境としてdockerを使ってみようという魂胆。

fontconfigやらPhantomJS自体のビルドの時間はそこそこかかるけど、それを待ちさえすれば、がっつり自動化できた。

dockerの設定

Dockerfile

Linux環境にはCentosを使いたいのでDocker HubのCentosのページを参考にする。

# https://hub.docker.com/_/centos/
FROM       centos:7
MAINTAINER "YOU" <you@example>
ENV        container docker
RUN        (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
           rm -f /lib/systemd/system/multi-user.target.wants/*;\
           rm -f /etc/systemd/system/*.wants/*;\
           rm -f /lib/systemd/system/local-fs.target.wants/*; \
           rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
           rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
           rm -f /lib/systemd/system/basic.target.wants/*; \
           rm -f /lib/systemd/system/anaconda.target.wants/*; \

           yum install -y openssh-server openssh-clients; \
           yum install -y iproute iproute-devel; \
           yum -y install epel-release; \
           yum -y install gperf freetype-devel libxml2-devel python-lxml git-all libtool; \
           yum -y install npm bzip2; \

           passwd root -d; \
           sed -i "s/^.*PermitEmptyPasswords.*$/PermitEmptyPasswords yes/g" /etc/ssh/sshd_config; \
           sed -i "s/^.*PasswordAuthentication.*$/PasswordAuthentication yes/g" /etc/ssh/sshd_config; \

           mkdir -p /src/python; mkdir -p /src/node; \

           cd /src/python; \
           curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py; \
           python get-pip.py; \
           pip install -U six; \

           cd /src/; \
           git clone http://anongit.freedesktop.org/git/fontconfig; cd /src/fontconfig; \
           ./autogen.sh --prefix=/tmp/fontconfig --sysconfdir=/tmp/fontconfig/etc --bindir=/tmp/fontconfig/usr/bin --enable-libxml2; \
           make; make install; \

           cd /src/node; \
           npm install phantomjs-prebuilt; \
           mv /src/node/node_modules/phantomjs-prebuilt /tmp/phantomjs-prebuilt;

VOLUME     [ "/run", "/tmp" ]
CMD        [ "/usr/sbin/init" ]

RUNの部分の話を自分が忘れないようにするレベルでまとめておく。

  • 前半のrmしまくってるのは、systemdまわりの対応。Docker HubのCentosのページを参照。
  • yumでインストールしているのは2種類。
    • opensshはあとでscpでファイルを取り出したいので、sshdがほしいからくらい。clientはいらないけどついで。
    • iprouteは、困ったときのipコマンドのため。デバッグ用途なので、実際には使わない。
    • 残りはfontconfigとPhantomJSをビルドするために必要なもの(いらないもの混じってるかもだけど精査してない)。
  • passwdでパスワード消したり、sshd_configでセキュリティ弱めているのは、ファイルを取り出すときにパスワードとかいろいろ聞かれたくないから。
    • 本番環境では「ダメ、絶対」な設定だけど、今回はこれで。
  • pipsixは、fontconfigのautogenのタイミングで必要なので入れておく。
  • あとは、fontconfigとPhantomJSをビルド。
  • ファイルを取り出しやすいように、それぞれtmpディレクトリに移動させてる。

デバッグ

簡易的に接続してみるなら、attachは使わずに、ssh感覚でexec+bash-it(= interactive, tty)オプションをつけて実行。 本来の用途ではないらしいので、あくまで簡易的に。

docker exec -it {container_id_or_name} /bin/bash

実行

以下の様なシェルスクリプトを作って実行してみた。

docker pull centos:7
docker build --rm -t local/centos7 .
docker create --name phantom --privileged -p 20022:22 local/centos7
docker start phantom

sleep 2

ssh-keygen -R "[localhost]:20022";
scp -o 'StrictHostKeyChecking no' -r -P 20022 root@localhost:/tmp/fontconfig fontconfig
scp -o 'StrictHostKeyChecking no' -r -P 20022 root@localhost:/tmp/phantomjs-prebuilt phantomjs-prebuilt

docker rm -f phantom
docker rmi local/centos7

ポイントといえば、、、

  • privilegedをつけてcreateしないとうまく動かない。systemdまわりの話(+SELinuxが絡んでたっけな?)
  • start後すぐにscpしてもうまく接続できない。1秒か2秒くらいあける。
  • scpで認証周りのことをきかれたくないから、ssh-keygen -Rknown-hostsをクリアして、StrictHostKeyCheckingをしないようにする。