使用 Docker 重建 Hexo 环境并通过 GitHub Pages 发布
之前搭建过一个 Hexo 博客,但长时间没有维护后,本地的 Hexo 源码和运行环境已经无法继续使用。考虑到当前本机的 Node.js 环境还有其他用途,因此这次没有直接升级本机 Node.js,而是使用 Docker 重新建立一个独立的 Hexo 运行环境。
最终采用的方案是:
1 | Markdown |
使用 Docker 初始化 Hexo
首先建立一个空目录:
1 | mkdir hexo-blog |
使用 Node.js 22 镜像启动一个临时容器:
1 | docker run --rm -it \ |
其中:
--rm:退出后自动删除临时容器;-it:使用交互式终端;-v "$PWD:/app":将当前目录挂载到容器的/app;-w /app:将/app设置为工作目录;node:22:使用 Node.js 22 环境。
进入容器后初始化 Hexo:
1 | npx hexo-cli init . |
完成后退出:
1 | exit |
虽然临时容器已经被删除,但 Hexo 项目已经通过 Volume 写入本地目录。
其中比较重要的是:
1 | package.json |
package.json 和 package-lock.json 保存了 Hexo 及相关 npm 依赖的信息,因此没有必要永久保存初始化时使用的容器。
后续只要 Node.js 版本以及这些项目文件还在,就可以通过:
1 | npm ci |
重新构建依赖环境。
创建 Docker 预览环境
在项目根目录创建 Dockerfile:
1 | FROM node:22 |
再创建 compose.yml:
1 | services: |
第一次启动:
1 | docker compose up --build |
之后正常启动只需要:
1 | docker compose up |
浏览器访问:
1 | http://localhost:4000 |
即可查看 Hexo 最终生成的页面。
使用完成后:
1 | docker compose down |
这样 Hexo 所需要的 Node.js 环境全部位于 Docker 中,不需要修改本机已有的 Node.js 环境。
保存源码而不是运行环境
这次重新搭建后,一个比较重要的变化是:Git 仓库保存完整的 Hexo 源码,而不是只保存 Hexo 生成的静态页面。
需要进入版本控制的主要内容包括:
1 | _config.yml |
而下面这些内容可以随时重新生成:
1 | node_modules/ |
因此可以加入 .gitignore:
1 | node_modules/ |
这样即使以后更换电脑或者删除 Docker 容器,只需要重新 Clone Git 仓库,就可以再次构建完整环境。
使用 GitHub Actions 发布
本地 Docker 只负责预览,正式构建和发布交给 GitHub Actions。
基本流程为:
1 | Git Push |
这样发布博客不再依赖某一台电脑上的 Hexo 环境。
日常完成文章后,只需要:
1 | git add . |
GitHub Actions 会自动完成后续构建和发布。
日常写作流程
文章本身仍然只是普通 Markdown 文件,保存在:
1 | source/_posts/ |
例如:
1 | --- |
平时可以直接使用自己习惯的 Markdown 编辑器编写和初步预览,并不需要为了创建文章而启动 Docker。
普通写作流程变成:
1 | 创建 Markdown |
只有修改主题、CSS、页面结构,或者需要确认 Hexo 最终渲染效果时,才启动:
1 | docker compose up |
进行完整预览。
总结
这次重建没有尝试保存一个长期运行的 Hexo 容器,而是保存了重新构建环境所需要的定义:
1 | Dockerfile |
Docker 解决本地环境隔离问题,Git 保存博客源码和环境定义,GitHub Actions 负责构建,GitHub Pages 负责最终托管。
这样即使以后再次长时间停止维护,只要源码仓库仍然存在,就可以重新构建整个 Hexo 环境,而不再依赖某一台机器上已经安装好的 Node.js 和 Hexo。