Skip to content

v0.8.2 —— 容器镜像发布链路修复(补发 v0.8.0 / v0.8.1 缺失的镜像)

Choose a tag to compare

@Levango7 Levango7 released this 21 Oct 23:02
· 345 commits to main since this release
616edb3

桌面产物与 v0.8.0 相同(桌面版本线独立,当前 0.6.0,本版未改动桌面代码)。

本版唯一的实质改动

web/Dockerfile 的基础镜像源改为 ARG NODE_IMAGE 可覆盖,默认回 Docker Hub 官方
node:22-alpine。这是让容器镜像真正能发出去的那一刀。

为什么连续两个版本都没有镜像

版本 Build Publish image (GHCR) 原因
v0.8.0 skipped skipped Security Audit 判红(vite 三连公告)→ 连锁 skip
v0.8.1 success failure 门禁已绿,但 Docker 构建失败于基础镜像源
v0.8.2 success success 修掉基础镜像源

v0.8.1 的 CI 实测是本次定位的依据:Build success 而 Publish image failure,
错误固定为——

#5 ERROR: failed to do request: Head "https://docker.m.daocloud.io/v2/library/node/manifests/22-alpine"
  dial tcp: lookup docker.m.daocloud.io on 168.63.129.16:53: no such host

web/Dockerfile 三个 FROM 此前写死第三方镜像源 docker.m.daocloud.io,该源自
2026-10-20 21:41 UTC 最后一次成功拉取后失效。此后 main 上每一次 push 的
Publish image (GHCR) 全部 failure——也就是说,不只是没发版,是连 main 的镜像都断了。

实测双侧网络,结论正好相反:

环境 docker.m.daocloud.io Docker Hub
本机(国内网络) 可达(HTTP 401) 不可达(curl 000)
GitHub 托管 runner NXDOMAIN 可达

把只在一侧可用的第三方镜像源写死进 Dockerfile,等于把发布链路押在别人的可用性上。
v0.7.2 之所以有镜像,只是因为那个源当时还活着。

修复形态

ARG NODE_IMAGE=node:22-alpine
FROM ${NODE_IMAGE} AS deps
FROM ${NODE_IMAGE} AS builder
FROM ${NODE_IMAGE} AS runner
  • 默认回 Docker Hub 官方镜像,CI/生产开箱可用
  • 国内/内网换源改为构建时覆盖,不改默认值(改默认值就等于把 CI 又押给第三方):
    docker build --build-arg NODE_IMAGE=docker.m.daocloud.io/library/node:22-alpine .
  • 顺带把「三阶段必须同 node 版本同镜像源」从靠人记住变成结构保证:镜像源收敛成
    单个 ARG,改一处即全改,版本错配不可能再发生

使用

docker pull ghcr.io/levango7/corps:0.8.2
# 国内/内网如需换源构建:
docker build --build-arg NODE_IMAGE=docker.m.daocloud.io/library/node:22-alpine ./web

升级说明

  • 数据库迁移:无。本版相对 v0.8.0/v0.8.1 零业务代码变更,无需备份数据。
  • 需要跑迁移的是 v0.7.2 → v0.8.0 那一跳(4 条迁移,其中
    20261007000000_dedup_task_conversations 会删数据)。若还没升到 v0.8.0,
    请先按 v0.8.0 release 的说明操作:
    pg_dump -t conversations -t messages -t conversation_members -t chat_presences > backup.sql
    并以 BYPASSRLS 角色执行迁移。

已知缺口(建议单独修)

CI 完全不验证 Dockerfile:PR 事件下 Publish image (GHCR) 是 skipped,
Build job 只跑 pnpm run build。本次缺陷能一路潜伏到发布阶段才暴露,根子就在这里。
已记入 CHANGELOG,建议补一条 Docker 构建冒烟检查。