用 Docker 创建 Jekyll 网站

有了 Docker,就没有了不用它的理由,更不用说每天都要用的 Jekyll 了。

平台: CentOS 7 mini

项目结构

目录结构

最基本的目录结构如下:

.
├── dist
├── docker-compose.yml
└── src
    ├── Gemfile
    ├── Gemfile.lock
    ├── _config.yml
    ├── _posts
    │   └── welcome-to-jekyll.md
    ├── about.md
    └── index.md
  • src :Jekyll 源文件
  • dist :编译后的静态站点

开发流程:

  • 日常的修改在 src 目录中完成:如新建、修改 posts 等
  • 在 Docker 容器中运行 Jekyll,完成编译,预览卷 dist 中的静态网站
  • 如果需要,检查 dist 目录中生成的站点
  • 推送到 GitLab,使用 GitLab CI 来重新构建 GitLab 页面。或者直接把静态页面上传到网站服务器。

配置

修改 docker-compose.yml

version: '2'

services:
  site:
    image: jekyll/jekyll
    volumes:
      - ./src:/srv/jekyll/site
      - ./dist:/srv/jekyll/_site
    ports:
      - "80:4000"

初始化站点

$ docker-compose run site jekyll new site --force
# 如果上条命令出错,建议使用下条:
$ sudo /usr/local/bin/docker-compose run site jekyll new site --force

构建并预览

一切就绪后,可以开始构建网站了。

命令太长,建一个别名 dc

$ sudo vi ~/.bash_profile
alias dc="sudo /usr/local/bin/docker-compose"
$ . ~/.bash_profile

构建,预览

$ dc run --service-ports site jekyll serve --source site

此时可以通过 http://localhost 来检查是否构建成功。

Gitlab 的配置

在项目根目录创建 .gitlab-ci.yml 文件:

pages:
  image: alpine:latest
  script:
  - cp -R ./dist ./public
  artifacts:
    paths:
    - public
  only:
  - master

这样配置好以后,master 分支每次在检测到推送时,都会启动一个 GitLab CI 管道,然后会将 dist 目录作为 Gitlab page 的根目录来挂载。

在 Gitlab 创建一个新项目

创建一个名为 project 的新项目,然后将本地项目的修改推送给 master 分支。

首先,要更新一下 /src/_config.yml

baseurl: "/project"

重新构建网站:

$ dc run site jekyll build --source site

然后可以推送了:

$ git init
$ git remote add origin git@gitlab.com:{username}/project.git
$ git add .
$ git commit -m "Initial commit"
$ git push -u origin master

日常维护

准备创建或修改文章之前,先将其置于 serve 状态,这样,一旦它检查到 src 目录中内容的变化,它会自动重新加载。

$ dc run --service-ports site jekyll serve --source site

通过本地预览,确认修改完成,推送到 GitLab ,更新完成。

更新

如果修改了 Gemfile,想要更新 Gemfile.lock,可以运行:

$ export JEKYLL_VERSION=3.8
$ docker run --rm --volume="$PWD:/srv/jekyll" -it jekyll/jekyll:$JEKYLL_VERSION bundle update