thumbor の docker 化

Docker については Web や書籍で情報は追いつつも手を動かせていなかったがそろそろやらねばということで、まずは以前紹介した画像のサムネイル化やクロップ、フィルタ処理を行う thumbor を docker 化してみた。

Dockerfile などは github に置いてある。

普段は CentOS を使うことが多いが公式 Docker image などでは ubuntu や debian が使われていることが多いようなので ubuntu での image も作ってみた。プライベートの Note PC はずっと Linux mint か Ubuntu だったけど未だに package 名とか apt に慣れない…
thumbor の .travis.yml を参考にして動くようになった。

Thumbor は画像処理エンジンを PIL (Python Image Library), GraphicsMagick (pgmagick), OpenCV の3つから選択できるようになっています。今回の docker image には全部含まれるようにしたので docker run の時の環境変数 (-e) で切り替えられます。(相変わらず pgmagick の build は重い…)

Makefile に書いておいたので make run-pil, make run-pgmagick, make run-opencv でそれぞれのエンジンで起動できます。3つ別ポートで起動させれば簡単にそれぞれの比較ができます。

環境変数は ENGINE の切り替えにとどまらず、設定の動的書き換え全般が行えます。

Dockerfile の CMDthumbor.sh を指定してあり、THUMBOR_ で始まる環境変数は THUMBOR_ を取り除いて設定ファイルに書き出して thumbor を起動するようになっています。設定可能な値は docker run -i --rm=true thumbor-centos /opt/thumbor/bin/thumbor-config で確認できます。(ENTRYPOINT を指定すると run 時に変更できないが CMD なら変更可能という学び)

同様に thumbor-url コマンドが実行できるので SECURITY_KEY でのハッシュ付き URL を作ることもできます。

base64.urlsafe_b64encode(hmac.new(security_key, unicode(url).encode('utf-8'), hashlib.sha1).digest())

でもできますが。その他 crop とか filter 月の URL 生成のテストができます。すでに docker で動かしていれば docker run の代わりに docker exec でそのインスタンスを使うこともできます。

ENGINE の比較が簡単にできるので feature or facial detection の効果を見てみたいと思います。
こちらの画像

DETECTORS = [
  'thumbor.detectors.face_detector',
  'thumbor.detectors.feature_detector'
]

とした OpenCV エンジンとそうでないものを比較すると次のようになりました。detection が有効であればサイズ調整時に人物が真ん中に来るようになります。その代わり処理が重い。それを回避するためにまずは detection なしの画像を返しておいて redis などに queue を登録し後のリクエストのために非同期で画像を準備しておく機能もあります。

girls-1107329_640 元画像

enable-detection detection あり

no-detection detection なし

Thumbor は元画像は処理後の画像をキャッシュする機能がありますが、手前に nginx を置いてキャッシュさせたほうが効率的ですね。そこで nginx の docker を調査していたら docker-gen とそれを使った jwilder/nginx-proxy という便利ツールがありました。開発環境で便利に使えそうです。
これは別途記事にしたいと思います。