使用 docker-compose 搭建 Hexo

距离上次写博客差不多两年了。大三了,不仅要准备实习和秋招的事,也该考虑将来的事了。现在打算不定期更新博客,起码将来有个能拿得出手的技术博客。


这次借着重新搭建博客的环境,改用 docker-compose 实现。

docker-compose 实现了多个容器的编排,大大简化大型项目的部署工程。


编写 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM node

ENV HEXO_VERSION=3.7.1
ENV NEXT_VERSION=6.3.0
ENV NEXT_PATH=themes/next

LABEL version="Hexo - ${HEXO_VERSION}, NexT - ${NEXT_VERSION}"
LABEL maintainer="nuomi1 <[email protected]>"

WORKDIR /blog

COPY docker-entrypoint.sh /usr/bin

RUN npm install -g hexo-cli && \
chmod +x /usr/bin/docker-entrypoint.sh

ENTRYPOINT docker-entrypoint.sh

EXPOSE 4000
VOLUME /blog

新版 docker 取消了 MAINTAINER 命令,使用 LABEL maintainer 作为替代。宿主机内的 docker-entrypoint.sh 可能没有执行权限,因此复制到容器后手动赋予执行权限。使用 ENTRYPOINT 执行容器启动前的准备工作。

编写 docker-entrypoint.sh

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env bash

if [ ! -f "_config.yml" ]; then
hexo init .
fi

if [ ! -f "${NEXT_PATH}/_config.yml" ]; then
git clone -b v${NEXT_VERSION} https://github.com/theme-next/hexo-theme-next.git ${NEXT_PATH}
fi

hexo server

执行自动化处理,把 Hexo 环境和博客数据分离,镜像(环境)随时升级而数据不会丢失。但是博客的 Hexo 组件仍需手动更新。

第一个 if 中,如果没有检测到站点配置文件 _config.yml 则初始化目录,前提是 WORKDIR 为空。

第二个 if 中,如果没有检测到主题配置文件 themes/next/_config.yml 则下载指定版本的 NexT 主题,版本从 DockerfileENV 获取。

最后启动 Hexo 服务。

编写 docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
version: '3'

services:
Hexo:
build: .
image: 'hexo:3.7.1'
restart: always
ports:
- 4000:4000
volumes:
- './Hexo:/blog'

强大的 docker-compose 来了,虽然这次的博客只用到了一个组件,体现不了其强大之处。

使用 image 指定创建的镜像的名称和标签。使用 volumes 绑定宿主机中的指定目录(当前 docker-compose.yaml 目录下的 Hexo 文件夹)到容器的挂载目录(/blog)。

BUG?

在 Docker 18.03.1-ce-mac65 (24312) 中,这样部署的 Hexo 无法实时追踪文件和即时解析。每次更改配置文件或修改博文后,无法即时预览,需要重启容器。

原本想添加 RSS(简易信息聚合)Algolia(站内搜索) 支持,但是执行 npm install --save hexo-generator-feednpm install --save hexo-algolia 后,却提示安装了 1 个包和删除了 100+ 个包,导致 Hexo 基础组件被删,还得重新 npm install 重新下载,不是很明白 npm 的逻辑。