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種類。passwd
でパスワード消したり、sshd_config
でセキュリティ弱めているのは、ファイルを取り出すときにパスワードとかいろいろ聞かれたくないから。- 本番環境では「ダメ、絶対」な設定だけど、今回はこれで。
pip
、six
は、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 -R
でknown-hosts
をクリアして、StrictHostKeyChecking
をしないようにする。