Docker 中 Ghost 1.x 升级到 2.x 的一个小坑

颓废了一阵子后,昨天准备继续写博客,登录 Ghost 后台看到提示升级到 2.x 的消息,于是决定先升级一下。

由于我的 Ghost 是用 Docker 镜像搭建的,当时使用的镜像版本是 Ghost:1.23.0-alpine,所以决定使用以下方式升级:

  1. 备份数据。
  2. 删除 Ghost 容器。
  3. 使用 Ghost:2-alpine 镜像创建容器并挂载原来的文件夹。

然而网站挂了……

docker logs 命令查看容器运行记录,在最后看到了以下信息:

    at runCallback (timers.js:810:20)
    at tryOnImmediate (timers.js:768:5)
    at processImmediate [as _immediateCallback] (timers.js:745:5)

Error: SQLITE_ERROR: table posts has no column named comment_id

搜索了一下,在官方 GitHub 项目中看到这个 Issue:update ghost from 1.x to 2.x in docker

随后在 DockerHub 的 Ghost 镜像介绍 中找到了相关内容:

Upgrading Ghost
You will want to ensure you are running the latest minor version (1.25.5 or 0.11.9) of Ghost before upgrading major versions. Otherwise, you may run into database errors.
For upgrading your Ghost container you will want to mount your data to the appropriate path in the predecessor container (see below): import your content from the admin panel, stop the container, and then re-mount your content to the successor container you are upgrading into; you can then export your content from the admin panel.

大意就是 1.x 升级到 2.x 时,要先升级到 1.x 中的最新版本,再升级到 2.x,否则数据库会出现问题,估计是从某个版本开始改了数据表结构。

由于我用的是 alpine 系列镜像,所以正确的升级方式是:

  1. 备份数据。
  2. 删除 Ghost 容器。
  3. 使用 Ghost:1-alpine 镜像创建容器并挂载原来的文件夹,进入 Ghost 管理后台确定是否正常。
  4. 再次删除 Ghost 容器。
  5. 使用 Ghost:2-alpine 镜像创建容器并挂载原来的文件夹,升级完成。

其实还有一种方法:

  1. 备份数据,在 Ghost 管理后台导出内容备份(一个 json 文件)。
  2. 删除 Ghost 容器。
  3. 删除外部挂载文件夹中,位于 data 文件夹下的 ghost.db 文件。
  4. 使用 Ghost:2-alpine 镜像创建容器并挂载原来的文件夹。
  5. 这时候是个全新的 Ghost 网站,走一遍账号创建流程进入管理后台,导入 json 文件。

发表评论

电子邮件地址不会被公开。 必填项已用*标注