升级失败,不支持的 Docker 版本

Ubuntu 16
点击网页升级,就像我们多次操作的那样。现在失败了,应用程序无法重新构建不支持的 Docker 版本。

有什么想法吗?我可以尝试升级操作系统等等,但今天我没有太多时间。

有办法回退吗?

我尝试将版本设置为旧的哈希值,但在尝试重新构建时立即出现不支持的 Docker 版本

你不能升级。

我会迁移到一个新的虚拟机并在那里恢复数据库。这样更简单,几乎没有停机时间,如果出了问题,你只需继续使用正常工作的服务器。

哦。抱歉。我没有仔细阅读。

不。你不能回去。

如果你使用docker的安装程序,你也许可以升级docker。

我进行了操作系统升级等操作,并完成了PostgreSQL 15的升级,但现在我当我重建应用程序时,出现了

2025-05-18 14:58:28.208 UTC [1455] discourse@discourse ERROR:  列 "require_message" 不存在,字符 72
2025-05-18 14:58:28.208 UTC [1455] discourse@discourse STATEMENT:  SELECT id, name, name_key, description, notify_type, auto_action_type, require_message, applies_to, position, enabled, score_type FROM "flags" ORDER BY "flags"."position" ASC
** 插件失败 **

由于在插件初始化期间出现此错误,您无法启动Discourse:

PG::UndefinedColumn: ERROR:  列 "require_message" 不存在
LINE 1: ..._key, description, notify_type, auto_action_type, require_me...
                                                             ^

在我重新构建(Postgres升级后)后出现

执行升级
------------------
分析新集群中的所有行  通过
冻结新集群中的所有行  通过
删除新pg_xact文件夹内的文件  通过
复制旧的pg_xact到新服务器  通过
设置新集群的最旧XID  通过
设置新集群的下一个事务ID和纪元  通过
删除新pg_multixact/offsets中的文件  通过
将旧的pg_multixact/offsets复制到新服务器  通过
删除新的pg_multixact/members中的文件  通过
将旧的pg_multixact/members复制到新服务器  通过
设置新集群的下一个多事务ID和偏移  通过
重置WAL存档  通过
在新集群中设置frozenxid和minmxid计数器  通过
在新集群中还原全局对象  通过
在新集群中还原数据库架构  通过
复制用户关系文件  通过
设置新集群的下一个OID  通过
同步数据目录到磁盘  通过
创建删除旧集群的脚本  通过
检查扩展更新  提示

您的安装中包含应使用ALTER EXTENSION命令更新的扩展。
通过数据库超级用户执行update_extensions.sql文件,将会更新这些扩展。


升级完成
----------------
优化器统计信息不会由pg_upgrade传输。
启动新服务器后,建议运行:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

运行此脚本将删除旧集群的数据文件:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
Postgres升级完成

旧的13数据库存放在 /shared/postgres_data_old

要完成升级,可以再次使用:

./launcher rebuild app

有什么我可以做的吗?我不确定为什么会缺少这个列。

是的。有一些关于类似问题的帖子。我认为迁移被撤销了,所以你处于一种不确定的状态。

也许手动添加该列。

我不太确定该怎么做,更具体地说,是关于哪个表格等。是否有相关信息我可以找到。我确实找到了你提到的那篇文章,但没有具体细节。

谢谢你!

我甚至无法挂载数据库到可以添加列的程度。我打算尝试禁用所有插件,看看是否至少能启动容器。

好的,这是我们如何修复它的方法(这不适合胆小的人)

  1. 将 Ubuntu 升级到支持 Docker 20+ 的版本
    我们在 Ubuntu 16,我必须至少升级到 Ubuntu 20,所以我们升级了两次
RELEASE_UPGRADER_ALLOW_THIRD_PARTY=1 do-release-upgrade
  1. 到达 Ubuntu 20 后,我们必须更新 Docker,Ubuntu 拒绝自行更新。
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 将仓库添加到 Apt 源:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
  1. 这将我们带到了 Docker 28
  2. 然后运行
./launcher rebuild app
  1. 这会将您的 PostgreSQL 从 13 升级到 15,请参阅:
    PostgreSQL 15 update
  2. 数据库成功升级后,运行
./launcher rebuild app
  1. 这会产生一个关于缺少列的错误
2025-05-18 14:58:28.208 UTC [1455] discourse@discourse ERROR:  column "require_message" does not exist at character 72
2025-05-18 14:58:28.208 UTC [1455] discourse@discourse STATEMENT:  SELECT id, name, name_key, description, notify_type, auto_action_type, require_message, applies_to, position, enabled, score_type FROM "flags" ORDER BY "flags"."position" ASC
** PLUGIN FAILURE **

由于在插件初始化期间出现此错误,您无法启动 Discourse:

PG::UndefinedColumn: ERROR:  column "require_message" does not exist
LINE 1: ..._key, description, notify_type, auto_action_type, require_me...
                                                             ^
  1. 此时无法启动容器,所以我去了 app.yml 并禁用了所有插件,然后再次运行重建
  2. 应用程序最终重建成功,然后我能够进入 rails 控制台手动添加上述列。
./launcher enter app
rails db
ActiveRecord::Base.connection.execute("ALTER TABLE flags ADD COLUMN require_message BOOLEAN DEFAULT FALSE;")
exit
exit
  1. 列存在后,我回到 app.yml 并启用了所有插件,然后再次进行重建
  2. 重建成功……我们上线了!

感谢 @pfaffman 在周末的及时回复。我们将创建一个新的更新的 Droplet 并迁移过去。这本应是通过 Web 界面进行快速的就地升级。但我想脚本没有测试 Docker 的兼容性。当它升级 Discourse Docker 时,它抛出了不兼容的 Docker 错误。

这完全是我们的错,因为我们还在使用非常旧的 Ubuntu 16 版本,稳定系统的优点和缺点之一是它倾向于长期存在。

1 个赞

很高兴你搞定了!这真是太厉害了!

当你的操作系统已经超过了生命周期 4 年时,你无法进行快速更新。 :wink:

1 个赞

优,学到的教训,再次感谢!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.