DockerでJekyllのイメージを動かそうと思ったらエラーで起動しない[解決]
背景
GitHub PagesにWebサイトを公開したが、修正を確認するために毎回Pushするのは面倒なので、ローカルに開発環境を構築したい。
ローカル環境を汚染したくないのでDockerの利用を検討。
jekyll公式のイメージがあるのでそれを利用してみたが、うちの環境では起動しない。
環境
Windows10/WSL2/Ubuntu22.04
Docker Desktop
設定ファイルと実行結果
docker-compose.yml
version: "3"
services:
app:
container_name: jekyll
image: jekyll/jekyll:pages
command: jekyll serve --no-watch --trace
volumes:
- ./:/srv/jekyll
ports:
- 4000:4000
ログ
$ sudo docker-compose up
Starting sistersatoricom_jekyll_1 ... done
Attaching to sistersatoricom_jekyll_1
jekyll_1 | ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux-musl]
jekyll_1 | Configuration file: /srv/jekyll/_config.yml
jekyll_1 | Source: /srv/jekyll
jekyll_1 | Destination: /srv/jekyll/_site
jekyll_1 | Incremental build: disabled. Enable with --incremental
jekyll_1 | Generating...
jekyll_1 | done in 0.817 seconds.
jekyll_1 | Auto-regeneration: disabled. Use --watch to enable.
jekyll_1 | <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- webrick (LoadError)
jekyll_1 | from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
jekyll_1 | from /usr/gem/gems/jekyll-3.9.0/lib/jekyll/commands/serve/servlet.rb:3:in `<top (required)>'
jekyll_1 | from /usr/gem/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb:184:in `require_relative'
jekyll_1 | from /usr/gem/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb:184:in `setup'
jekyll_1 | from /usr/gem/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb:102:in `process'
jekyll_1 | from /usr/gem/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb:93:in `block in start'
jekyll_1 | from /usr/gem/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb:93:in `each'
jekyll_1 | from /usr/gem/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb:93:in `start'
jekyll_1 | from /usr/gem/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb:75:in `block (2 levels) in init_with_program'
jekyll_1 | from /usr/gem/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `block in execute'
jekyll_1 | from /usr/gem/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `each'
jekyll_1 | from /usr/gem/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `execute'
jekyll_1 | from /usr/gem/gems/mercenary-0.3.6/lib/mercenary/program.rb:42:in `go'
jekyll_1 | from /usr/gem/gems/mercenary-0.3.6/lib/mercenary.rb:19:in `program'
jekyll_1 | from /usr/gem/gems/jekyll-3.9.0/exe/jekyll:15:in `<top (required)>'
jekyll_1 | from /usr/gem/bin/jekyll:25:in `load'
jekyll_1 | from /usr/gem/bin/jekyll:25:in `<main>'
sistersatoricom_jekyll_1 exited with code 1
エラー内容
<internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in require': cannot load such file -- webrick (LoadError)
webrickというライブラリが読み込めてないっぽい。
調査
jekyll/jekyll:pagesイメージのコンテナを起動して、中身を調査してみる
$ docker run -v $(pwd):/srv/jekyll -it jekyll/jekyll:pages bash
(docker)# jekyll serve --no-watch --trace
同様のエラーが発生することを確認。
WebrickのGemをインストールして再実行してみる
(docker)# gem install webrick
(docker)# jekyll serve --no-watch --trace
エラーが解消され、起動を確認。
ファイル修正
手動でコンテナを立ち上げて、Gemインストールしてなんてやってられないので、自動でwebrickをインストールしてからコンテナを立ち上げるように変更する。
Dockerfile
FROM jekyll/jekyll:pages
RUN gem install webrick
docker-compose.yml
version: "3"
services:
app:
container_name: jekyll
build:
context: .
dockerfile: Dockerfile
command: jekyll serve --no-watch --trace
volumes:
- ./:/srv/jekyll
ports:
- 4000:4000
起動
$ sudo docker-compose up
起動できた。
今後の課題
今回の解決法よりよい方法がないか考える
ファイルの更新を検知して自動リロードなどができない問題の解決。(WSLの仕様上jekyll —watchオプションは利用できないらしい)