Jekyll on Docker

A technical insight into how this blog is maintained and published

Posted by Eddo on December 7, 2018

There are multiple ways you can run a blog, either using WordPress, Squarespace, among others. I’ve decided a long time ago that I’d like to use my website as a experimental platform, though keeping the content consistent. My latest experiment, which is now running for over a year, is to host this as a static site, where my server delivers plain HTML files. I’m using a static site generator called Jekyll to create these HTML files based on templates and content written in Markdown. I’ve written an article in the past about my workflow for writing, this article will provide some technical insight (as I promised a few weeks ago).

I’ve been playing around with Docker now for a while, and I did like the idea of having all dependencies of an application inside a container so that it doesn’t clutter up your regular system/workstation. This is especially a thing working with Ruby and gems on macOS. I had to install some dependencies in multiple versions, and that will conflict at some point in time. Docker has provided me a way to keep those dependencies within the container for my website project, not affecting other projects.

There is already a Docker image for Jekyll available, which can be used for these purposes. I added some changes to make it work for my website project, that included resizing images for multiple resolutions (based on a fixed version of Netlify’s jekyll-srcset gem).

# The base image
FROM jekyll/jekyll

# Using the _edge_ Alpine repository, as I need a specific version of `ruby-rmagic`
RUN echo 'http://dl-cdn.alpinelinux.org/alpine/edge/main' >> /etc/apk/repositories

# `imagemagick6-dev` needs to stay in it's own command, as it overwrites some dependencies of imagemagick6
RUN apk add --no-cache ruby-rmagick=2.16.0-r2 \
  && apk add --no-cache imagemagick6-dev

COPY Gemfile .

# Run the install of gems within the Docker build process
RUN bundle install

My Dockerfile with some comments

Together with a docker-compose.yml file, that you can see below, I’m able to run my site locally and build it. Using the command docker-compose up I can run it locally (after which it is available via http://localhost:4000), and with docker-compose run jekyll jekyll build the site is built for production (without the drafts).

version: '2'
services:
  jekyll:
    build: ./
    command: jekyll serve --drafts --watch --incremental
    ports:
        - 4000:4000
    volumes:
        - .:/srv/jekyll

My docker-compose.yml file

When I’m ready to publish a new article, I build the site with one of the mentioned commands above, and then push the changes to my server with an rsync shell script.

Concluding; it doesn’t have to be complicated to setup Jekyll on Docker. It saves my macOS workstation from becoming cluttered with Ruby gems, and if I mess up, I can start over from scratch relatively quickly.

P.S. If you’ve enjoyed this article or found it helpful, please share it, or check out my other articles. I’m on Instagram and Twitter too if you’d like to follow along on my adventures and other writings, or comment on the article.