Hcrypt

Jekyll and Docker


I was using Hugo for my last blog. It is a great way for anyone to quickly spin up a blog but it lacks customization and the poor usability with containers is not something I would have hoped for.

I know, using containers might decrease the overall performance but it’s not feasible to run everything on bare metal because it gets clunky and hard to manage.

I couldn’t find anything useful on regards to running jekyll on a docker container, so I made one myself!

Making the image


Jekyll uses ruby, which I thought was an innocent language with an easy dependency management. I was wrong. It was very frustrating to keep getting tons of errors while I was building the image.

Anyway, let’s jump into the Dockerfile. It’s very minimal and easy to understand

FROM ubuntu:latest

COPY . /app

WORKDIR /app

RUN apt update && apt upgrade -y && apt install ruby ruby-dev 
	make build-essential -y && gem install bundler jekyll
	&& bundle update

EXPOSE 4000

CMD ["bundle", "exec", "jekyll", "serve","--host=0.0.0.0",
	"--livereload"]

Let’s briefly go over a few lines:

RUN apt install ruby ruby-dev make build-essential -y && 
	gem install bundler jekyll && bundle update

First, we are installing ruby and ruby-dev. After that, we are installing jekyll and bundler using gem, which is a ruby dependency management tool. Very similar to pip.

EXPOSE 4000

CMD ["bundle", "exec", "jekyll", "serve","--host=0.0.0.0",
	"--livereload"]

Jekyll runs on port 4000 and that is why we are exposing it. The last line can be updated according to your requirements. I am binding host on 0.0.0.0 and using livereload so that I don’t have to restart the container for changes to take place.

Deploying


Alrighty! Let’s deploy it with docker-compose

version: "3.9"

services:
  jekyll:
      build:
          context: .
          dockerfile: Dockerfile
      container_name: jekyll
      ports:
        - "4000:4000"
      restart: unless-stopped
      volumes:
        - .:/app

We are simply building the image with Dockerfile and binding the port 4000.

Now, I used nginx for reverse proxy. You could use caddy which is pretty easy compared to nginx.

That’s it. You have now containerized your blog!