JekyllをDocker上で動かして環境依存の問題から解放される

f:id:syonx:20170108014347p:plain

自分でブログシステムを使ってサイトを構築していると、プレビューするためのローカル実行環境を作ったり、ビルドをする際にエラーに悩まされることがよくあります。今回も、しばらく放置していたブログを久しぶりに更新しようとしたらハマりました。この機会に Docker を活用して環境依存の問題から開放されようと頑張ってみました。

Jekyll 公式 Docker イメージ

Dockerfile を見てみると、内部的に jekyll というユーザが /srv/jekyll という空っぽのワークディレクトリで構えていることがわかります。 この /srv/jekyll ディレクトリに自分の Jekyll ソースや設定ファイル、書き溜めた Markdown ファイルを渡して $ jekyll serve させて使います。

Docker コンテナ内で Jekyll の自動生成ページを試す

冒頭のイメージはこれを実行すれば見られます。

$ docker run -it --rm -p 4000:4000 jekyll/jekyll bash

bash-4.3# jekyll new .
New jekyll site installed in /srv/jekyll. 

bash-4.3# jekyll serve
Configuration file: /srv/jekyll/_config.yml
            Source: /srv/jekyll
       Destination: /srv/jekyll/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
                    done in 0.397 seconds.
 Auto-regeneration: enabled for '/srv/jekyll'
Configuration file: /srv/jekyll/_config.yml
    Server address: http://0.0.0.0:4000/
  Server running... press ctrl-c to stop.

実際に使っている Docker コマンド

start.sh

#!/bin/sh
docker run -it --rm -p 4000:4000 -v $(pwd):/srv/jekyll jekyll/jekyll jekyll serve

stop.sh

#!/bin/sh
image=jekyll/jekyll
docker rm $(docker stop $(docker ps -a -q --filter ancestor=$image --format="{{.ID}}"))

ハマったところ

検証が済んだところで、実際に自分で作ったページロジック(サイトマップやフィード)、過去に書いた記事などを含めて docker build したところ、失敗しました。原因は Gemfile ・ Gemfile.lock が残っていたためです。これまでは $ bundle install を使っていたので、ここに Jekyll を動作させるための Gem を書いていました。これからはその役目を Docker コンテナが担うので、不要になります。ただし、この Jekyll 公式イメージが賢くて docker run 実行時に Gemfile が入っていると自動的にインストールされる仕組みになっているようです。おそらく追加で Gem が必要なときに書いて動作に含めることができるのでしょう。特殊なことをしていない場合は不要となります。