Skip to content

v2.2.12

Latest

Choose a tag to compare

@github-actions github-actions released this 18 Oct 16:22

feat: 新增 Docker 管理页面,按节点管理容器与镜像

背景:此前只有「应用管理」(面板配方安装、有安装记录)和「节点详情 → Docker 引擎」
(服务级安装/启停)。节点上手工 docker run 出来的容器既不在应用列表里,
也没有统一的操作入口,只能上机敲命令。

新增「Docker 管理」页面(菜单项,权限 node:read):

  • 容器:启动 / 停止 / 重启 / 删除 / 查看尾部日志(可选 100~1000 行);
    状态、镜像、端口、创建时间、可写层大小一屏可见;
    「面板安装」标签标出有面板安装记录的容器(建议到应用详情操作,
    避免手工 stop 后与面板记录不一致)。
  • 镜像:按节点列出仓库:标签、ID、大小、创建时间、在用容器数,可删除未被占用的镜像。
  • 拉取镜像:后台任务(docker_pull_image),带进度输出。
  • 清理:只做两类安全清理——已停止的容器、悬空(无 tag)镜像;
    不删带 tag 的镜像与未使用的卷/网络。
  • 节点选择器支持「全部节点(聚合)」:并发查询各节点,
    单个节点失败不影响其它节点,失败原因随该节点一行回传(聚合视图只列容器,
    镜像/拉取/清理按节点操作)。

后端:

  • 新增 internal/apps/docker_manage.go:容器/镜像列表解析、容器操作、日志、
    镜像删除、拉取、清理,以及多节点聚合。
  • 新增任务类型 docker_pull_image / docker_prune,终态写审计。
  • 新增接口:
    GET /api/nodes/{id}/docker/containers
    POST /api/nodes/{id}/docker/containers/{cid}/action
    GET /api/nodes/{id}/docker/containers/{cid}/logs?tail=N
    GET /api/nodes/{id}/docker/images
    DELETE /api/nodes/{id}/docker/images/{iid}
    POST /api/nodes/{id}/docker/images/pull
    POST /api/nodes/{id}/docker/prune
    GET /api/docker/containers(聚合)
    读操作需 node:read,写操作需 node:write 并写审计。
  • Agent 的 Docker 代理白名单补上 POST /images/prune(面板只用 dangling=true
    删悬空镜像,全量 prune 不放行)。

细节与防错:

  • 容器/镜像 ID 走白名单正则再拼进 Engine API 路径,挡住路径穿越。
  • 端口优先显示宿主端口并去重;无映射时退回容器端口,避免端口列全空。
  • 连不上 Engine 时区分「未安装」与「装了没启动」,给出对应指引,
    而不是统一报 dial unix /var/run/docker.sock。
  • 删除运行中的容器自动带 force=true(先 SIGKILL 再移除),并在确认框里说明。

验证:

  • 新增 apps 用例:容器列表解析/排序/端口去重与回退/sha256 前缀截断、
    面板安装标记、路径穿越拒绝、Engine 非 200 报错、聚合视图容错、
    镜像 解析、未知清理目标拒绝。
  • 新增 api 用例:聚合路由与鉴权、未知容器操作/清理目标 400。
    注意 CI(ubuntu runner)自带 Docker,故不写「某节点必然连不上」这类环境断言。
  • go build / go vet 通过;go test ./... -p 1 全量通过(20 个包)。
  • 前端 vite build 通过;运行时冒烟:聚合 200 空列表、单节点返回中文指引、
    未知操作/清理目标 400。

完整提交:f2051ca