JekyllをDocker上で動かして環境依存の問題から解放される
自分でブログシステムを使ってサイトを構築していると、プレビューするためのローカル実行環境を作ったり、ビルドをする際にエラーに悩まされることがよくあります。今回も、しばらく放置していたブログを久しぶりに更新しようとしたらハマりました。この機会に 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 が必要なときに書いて動作に含めることができるのでしょう。特殊なことをしていない場合は不要となります。
追記 at 2018/03
- envygeeks/jekyll-docker
- GitHub Pages ではリポジトリのルートに各種ソース(
_posts
など)が配置されている必要あり