From 3ce8065f562e5f54fc1e7673c8cb2986209f5bbc Mon Sep 17 00:00:00 2001 From: Gloridust Date: Thu, 16 Jul 2026 20:58:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(self-update):=20WOC=5FVERSION=20=E7=BB=9D?= =?UTF-8?q?=E4=B8=8D=E4=BB=8E=E6=97=A7=E5=AE=B9=E5=99=A8=E7=BB=A7=E6=89=BF?= =?UTF-8?q?=20=E2=80=94=E2=80=94=20=E4=BF=AE=E3=80=8C=E6=B0=B8=E4=B9=85?= =?UTF-8?q?=E5=8D=A1=E5=9C=A8=E6=97=A7=E7=89=88=E6=9C=AC=E3=80=81=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=97=A0=E6=95=88=E3=80=8D(issue=20#107)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户反馈「一键更新到了 1.2.7」:更新后面板仍自报 v1.2.7。诊断包实锤——他的 panel.log 里同时有 v1.4.3+ 才写的代码日志、却打印「版本 v1.2.7」,即【顶着旧版本号跑新代码】。 根因:buildCreateOpts 用「容器 env != 旧镜像 baked」判定为 compose 注入并保留。但 WOC_VERSION 一旦 偏离(旧镜像 inspect 失败 → oldBaked 为空 → 所有容器 env 都被当成注入而保留),新面板就继承了旧版本号。 更糟的是【自我延续】:偏离后容器值与新镜像 baked 值永远不等,每次自更新都再次保留,用户永远出不来 (只能手删容器重建)。还连累版本耦合去找 wechat-on-cloud:<旧版本>。 修:WOC_VERSION 属【镜像身份】,加入排除名单,永远取新镜像 baked 值;compose 真注入的变量不受影响。 存量受害者可自愈:自更新的 helper 用的是新镜像的代码,故下次点更新即走修复后逻辑逃出循环。 --- panel/server/src/self-update.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/panel/server/src/self-update.ts b/panel/server/src/self-update.ts index 86ffbe0..72ef403 100644 --- a/panel/server/src/self-update.ts +++ b/panel/server/src/self-update.ts @@ -55,6 +55,15 @@ function pull(ref: string): Promise { }); } +// 【镜像身份】env:属于"这个镜像是哪一版",绝不能从旧容器继承,必须永远取新镜像 baked 值。 +// 教训(issue #107,用户反馈"一键更新到了 1.2.7"):下面的 env-diff 用"容器值 != 旧镜像 baked 值" +// 判定为"compose 注入、需保留"。但 WOC_VERSION 一旦偏离(旧镜像 inspect 失败 → oldBaked 为空, +// 于是【所有】容器 env 都被当成注入而保留),新面板就会顶着旧版本号跑新代码:自报 v1.2.7、 +// 点"更新"后还是 v1.2.7。更糟的是【自我延续】——偏离之后,容器值与新镜像 baked 值永远不等, +// 每次自更新都再次判定为"注入"并保留,用户永远出不来(只能手删容器重建)。 +// 还会连累版本耦合(resolveWechatImage 读 WOC_VERSION)去找不存在的 wechat-on-cloud:<旧版本>。 +const IMAGE_IDENTITY_ENV = new Set(['WOC_VERSION']); + function envToMap(env?: string[] | null): Map { const m = new Map(); for (const e of env || []) { @@ -78,6 +87,8 @@ async function buildCreateOpts(self: any, imageRef: string): Promise