Back to Dashboard

jekyll

4.4.1-alpine

Jekyll runtime with native build deps pre-installed. Multi-version retention tracks Jekyll upstream daily.

Trust posture

πŸ“‹ SBOM ATTESTEDπŸ›‘ 101 open alertsπŸ— AMD64 + ARM64 πŸ”— 6/6 deps tracked daily πŸ” REPRODUCE THESE CHECKS LOCALLY
PULLS 5.8K 4227 to 5848 pulls across 30 recorded days 2026-09-18: 4227 pulls2026-09-19: 4253 pulls2026-09-20: 4338 pulls2026-09-21: 4419 pulls2026-09-22: 4467 pulls2026-09-23: 4515 pulls2026-09-24: 4571 pulls2026-09-25: 4857 pulls2026-09-26: 5124 pulls2026-09-27: 5227 pulls2026-09-28: 5281 pulls2026-09-29: 5286 pulls2026-09-30: 5346 pulls2026-10-01: 5412 pulls2026-10-02: 5477 pulls2026-10-03: 5529 pulls2026-10-04: 5538 pulls2026-10-05: 5544 pulls2026-10-06: 5566 pulls2026-10-07: 5627 pulls2026-10-08: 5632 pulls2026-10-09: 5752 pulls2026-10-10: 5752 pulls2026-10-11: 5755 pulls2026-10-12: 5757 pulls2026-10-13: 5757 pulls2026-10-14: 5757 pulls2026-10-15: 5840 pulls2026-10-16: 5844 pulls2026-10-17: 5848 pulls
STARS 0

VERIFIABLE TRUST ARTIFACTS

Provenance

Build commit
43b72a4
Build digest
sha256:29fbba00abecc5f96d5edca1789dc3b0f48b865a6599a3d6df34121f0eb00b9f
Index digest
sha256:948cac19eccb8398e54c4eac5144fe793e1124564320f9dfe3680c17a324720c
Manifest digest (amd64)
sha256:a351ca019eaad4b9005300bad36759b0d84cb1320fecf6810b475707b07a35e6
Manifest digest (arm64)
sha256:b4f01eeb087a05bae7c86785a065855c1e75c71f7f1e67ee1a6ba05003d6fc14
SBOM attestation
55834413…
Trivy evidence
Code Scanning fetched 2026-10-17 11:24 UTC
Base image
ghcr.io/oorabona/library/ruby:3.3-alpine3.21
Verify
gh attestation verify oci://ghcr.io/oorabona/jekyll:4.4.1-alpine --owner oorabona guide β†’

Security evidence

Trivy Β· Code Scanning for image 4.4.1-alpine fetched 2026-10-17

101 open Code Scanning alerts Β· fetched 2026-10-17 Β· advisory mode (does not block builds)

Code Scanning: 101 open alerts Β· fetched 2026-10-17Recorded scan: 101 findings Β· scanned 2026-10-14
4Critical
23High
40Medium
34Low
0Info

Top advisories (upstream, advisory)

  • CVE-2026-42257 (CRITICAL) β€” net-imap-0.4.21.gemspec β€” net-imap: Net::IMAP: Arbitrary IMAP command injection via CRLF sequences in unvalidated input
  • CVE-2026-31789 (CRITICAL) β€” jekyll β€” openssl: OpenSSL: Heap buffer overflow on 32-bit systems from large X.509 certificate processing
  • CVE-2026-31789 (CRITICAL) β€” jekyll β€” openssl: OpenSSL: Heap buffer overflow on 32-bit systems from large X.509 certificate processing
  • CVE-2026-27820 (CRITICAL) β€” zlib-3.1.1.gemspec β€” zlib: zlib: Memory corruption via buffer overflow in Zlib::GzipReader
  • CVE-2026-84782 (HIGH) β€” jekyll β€” openssl: compat-openssl: openssl: Information disclosure via DTLS handshake retransmission

β†’ See verification steps.

Explore

Build lineage29fbba00abec
Build Lineage
Build Digest sha256:29fbba00abecc5f96d5edca1789dc3b0f48b865a6599a3d6df34121f0eb00b9f
Base Image ghcr.io/oorabona/library/ruby:3.3-alpine3.21
RUBY_VERSION 3.3
ALPINE_VERSION 3.21
JEKYLL_VERSION 4.4.1
BUNDLER_VERSION 4.0.23
WEBRICK_VERSION 1.9.2
JEKYLL_FEED_VERSION 0.18.0
JEKYLL_SEO_TAG_VERSION 2.9.1
JEKYLL_SITEMAP_VERSION 1.4.0
VERSION 4.4.1-alpine
MAJOR_VERSION 4
REMOTE_CR ghcr.io/oorabona
Package summary 393 packages
Recent changes +0 βˆ’0 ~2
Build history 10 builds
Dependency health all up to date

Dependency Health

all up to date
6/6 dependencies monitored
Up-to-date dependencies
BUNDLER_VERSION 4.0.23 WEBRICK_VERSION 1.9.2 JEKYLL_FEED_VERSION 0.18.0 JEKYLL_SEO_TAG_VERSION 2.9.1 JEKYLL_SITEMAP_VERSION 1.4.0 JEKYLL_VERSION 4.4.1

Documentation

README

Jekyll

Lightweight Alpine-based container for building and serving Jekyll static sites with live reload support.

Docker Hub GHCR Build

Verify this image

Every build ships a Sigstore-signed SBOM and a full Trivy scan β€” verify them yourself, no login required:

gh attestation verify oci://ghcr.io/oorabona/jekyll:latest --owner oorabona

Full walkthrough (SBOM payload, Trivy findings, multi-arch manifest inspection, upstream dependency tracking) β†’ https://oorabona.github.io/docker-containers/verify-images/

Quick Start

Docker Run

# Serve a site with live reload
docker run --rm -it \
  -v "$(pwd):/site" \
  -p 4000:4000 \
  -p 35729:35729 \
  ghcr.io/oorabona/jekyll:latest

# Build only (no server)
docker run --rm \
  -v "$(pwd):/site" \
  ghcr.io/oorabona/jekyll:latest \
  build

# Build to custom destination
docker run --rm \
  -v "$(pwd):/site" \
  ghcr.io/oorabona/jekyll:latest \
  build --destination /site/public

Docker Compose

services:
  jekyll:
    image: ghcr.io/oorabona/jekyll:latest
    ports:
      - "4000:4000"
      - "35729:35729"
    volumes:
      - ./site:/site
    command: ["serve", "--host", "0.0.0.0", "--livereload", "--force_polling"]

Then run:

docker compose up

Site available at: http://localhost:4000

The Compose profile runs with uid/gid 1000 by default, matching the image’s jekyll user. To keep bind-mounted files owned by your host account, pass your numeric identity explicitly:

LOCAL_UID="$(id -u)" LOCAL_GID="$(id -g)" docker compose up

With rootless Podman, container uids are remapped, so uid 1000 in the container is not your host account and cannot write the bind mount (Permission denied @ dir_s_mkdir - /site/.jekyll-cache). Map your host identity into the container instead:

podman run --rm --userns=keep-id -v "$(pwd):/site" ghcr.io/oorabona/jekyll:latest build

Features

  • Ruby 3.3 on Alpine Linux (minimal footprint)
  • Jekyll 4.4.1 with live reload
  • Bundler for dependency management
  • Node.js for JavaScript processing
  • Pre-installed plugins:
    • jekyll-feed - RSS/Atom feed generation
    • jekyll-seo-tag - SEO optimization meta tags
    • jekyll-sitemap - XML sitemap generation
  • WebRick server included
  • Git support for themes and plugins

Build Arguments

All dependency versions are pinned for reproducible builds:

Argument Default Description
RUBY_VERSION 3.3 Ruby major version
ALPINE_VERSION 3.21 Alpine Linux version
JEKYLL_VERSION 4.4.1 Jekyll core version
BUNDLER_VERSION 4.0.6 Bundler dependency manager
WEBRICK_VERSION 1.9.2 WebRick HTTP server
JEKYLL_FEED_VERSION 0.17.0 RSS/Atom feed plugin
JEKYLL_SEO_TAG_VERSION 2.8.0 SEO meta tags plugin
JEKYLL_SITEMAP_VERSION 1.4.0 Sitemap generation plugin

Ports

Port Purpose
4000 Jekyll development server
35729 LiveReload websocket

Volumes

Mount your Jekyll site directory to /site:

-v "$(pwd):/site"

Directory Structure

your-site/
β”œβ”€β”€ _config.yml          # Jekyll configuration
β”œβ”€β”€ _posts/              # Blog posts
β”œβ”€β”€ _layouts/            # HTML templates
β”œβ”€β”€ _includes/           # Reusable components
β”œβ”€β”€ assets/              # CSS, JS, images
β”œβ”€β”€ Gemfile              # Additional gem dependencies
└── _site/               # Generated output (auto-created)

Using a Gemfile

The container does not run bundle install. For gems the image does not ship, see Adding Custom Dependencies.

Security

Volume Permissions

The image runs as the non-root jekyll user (uid/gid 1000), and /site is writable by that user. Its HOME and Ruby/Bundler cache locations use /tmp, which is writable even when Docker runs the image with an arbitrary numeric uid that has no passwd entry. For a bind mount, use your host uid/gid so generated files remain owned by your account:

# Run as the host user
docker run --user "$(id -u):$(id -g)" \
  -v "$(pwd):/site" \
  ghcr.io/oorabona/jekyll:latest build

Production Deployment

For serving Jekyll sites in production:

  1. Build static files locally:
    docker run --rm -v "$(pwd):/site" ghcr.io/oorabona/jekyll:latest build
    
  2. Serve with a dedicated web server: Use nginx, Apache, or a CDN to serve the _site/ directory. The Jekyll container is intended for development only.

Network Security

  • Bind to 127.0.0.1 for local-only access:
    -p 127.0.0.1:4000:4000
    
  • Never expose port 4000 to the public internet
  • Use environment-specific _config.yml files to prevent sensitive data leaks

Dependencies

All Ruby gem versions are pinned and monitored for updates:

Gem Version Purpose
bundler 4.0.6 Dependency management
webrick 1.9.2 HTTP server
jekyll-feed 0.17.0 RSS/Atom feed generation
jekyll-seo-tag 2.8.0 SEO meta tags
jekyll-sitemap 1.4.0 XML sitemap generation

Adding Custom Dependencies

The image installs its gems at build time and runs as a non-root user, so it does not install a site’s Gemfile. To add gems, extend the image:

FROM ghcr.io/oorabona/jekyll:latest
USER root
RUN gem install jekyll-theme-cayman jekyll-redirect-from jemoji
USER jekyll

Architecture

jekyll/
β”œβ”€β”€ Dockerfile           # Alpine-based build
β”œβ”€β”€ config.yaml          # Dependency versions
β”œβ”€β”€ version.sh           # Upstream version checker
β”œβ”€β”€ docker-compose.yml   # Local development setup
└── README.md            # This file

Build Process

The Dockerfile uses a single-stage build:

  1. Start from ruby:{RUBY_VERSION}-alpine{ALPINE_VERSION}
  2. Install build dependencies (build-base, git, nodejs)
  3. Install Jekyll and plugins at pinned versions
  4. Remove build dependencies to reduce image size
  5. Set working directory to /site
  6. Configure default command: serve --host 0.0.0.0 --livereload

Building Locally

# Build with default versions
./make build jekyll

# Build with specific Jekyll version
./make build jekyll 4.4.1

# Build with custom arguments
docker build \
  --build-arg JEKYLL_VERSION=4.4.0 \
  --build-arg RUBY_VERSION=3.2 \
  -t jekyll:custom .

Version Management

# Check current version
cd jekyll && ./version.sh

# Check latest upstream version
cd jekyll && ./version.sh latest

# JSON output for automation
cd jekyll && ./version.sh --json
  • Jekyll Documentation: https://jekyllrb.com/docs/
  • Docker Hub: https://hub.docker.com/r/oorabona/jekyll
  • GitHub Container Registry: https://ghcr.io/oorabona/jekyll
  • Source Repository: https://github.com/oorabona/docker-containers
  • Issue Tracker: https://github.com/oorabona/docker-containers/issues