Skip to content

Repository files navigation

dsh-java-docker · Docker Lens(Docker 体检镜)

DSH 独立 AI 产品矩阵 #20 · 端口 8111 · 形态参照 dsh-java-mysql:独立工具型产品, 本身是完整可用的 Docker 体检后台 + DSH Java Native 插件(AI 运维体检员),而非"业务系统 + 右侧 AI 助手"。

产品定位

给本机 Docker 做只读体检:镜像/容器快照、体积瘦身建议、Dockerfile lint、compose 端口冲突图。

  • 镜像/容器清单:docker CLI 只读命令快照(docker images / docker ps -a),daemon 不可用时优雅降级——返回原因与转文本分析的建议,不报错;
  • 瘦身建议:分析 Dockerfile 文本(:latest 固定版本 / slim 基础镜像 / apt lists 清理 / 层合并 / .dockerignore);
  • Dockerfile lint:缺 CMD/ENTRYPOINT、root 运行、无 HEALTHCHECK、EXPOSE 端口非法(如 99999)、sudo 使用、多阶段构建建议;
  • 端口冲突图:解析 compose 文本的 ports 映射,标出多服务抢同一宿主端口的冲突。

AI 的角色是"熟练的运维体检员":一句话看镜像占用、找该瘦身的镜像、lint Dockerfile、查端口冲突。

AI 工具(插件 dsh-java-docker-plugin,前缀 plugin__dsh-java-docker-plugin__dk_*)

工具 作用
dk_list_images 本地镜像清单(daemon 不可用时降级说明)
dk_list_containers 容器清单与运行状态(只读)
dk_size_advice Dockerfile 文本 → 逐条瘦身建议
dk_dockerfile_lint Dockerfile 常见错误 lint
dk_port_map compose 端口冲突图

安全红线

  • 不 stop/rm 任何容器、不 push 镜像、不执行任何 docker 写命令——清单来自 images/ps 只读命令,其余全是纯文本分析;
  • daemon 不可用不臆造——明确返回降级说明,AI 被要求转文本分析而非编造容器数据;
  • systemPrompt + PRE_TOOL_USE hook 双重约束写操作。

架构

docker-app (Spring Boot :8111)                docker-plugin (DSH Java Native Plugin)
├─ POST /api/docker/images          ─┐        ├─ DshDockerPlugin extends AbstractHarnessPlugin
├─ POST /api/docker/containers       │        │   ├─ 5 × AbstractTool (dk_*)
├─ POST /api/docker/size-advice      │ Docker │   ├─ systemPrompt(运维体检员人设 + 红线)
├─ POST /api/docker/dockerfile-lint  │ Service│   └─ PRE_TOOL_USE hook(审计上下文注入)
├─ POST /api/docker/port-map         ┘        └─ SPI: META-INF/services/...JavaHarnessPlugin
└─ POST /api/assistant/stream ──→ harness :8090 /api/agent/stream(SSE 转发)

UI:static/index.html + app.js(会话管理、SSE 流式渲染、镜像/容器/瘦身/端口四工作台、Dockerfile lint 弹窗)。

运行

# 1. 启动 app(harness 8090 需已在运行)
SERVER__PORT= java -jar dsh-java-docker-app/target/*.jar --server.port=8111

# 2. 安装并激活插件
curl --noproxy '*' -X POST http://127.0.0.1:8090/api/harness/plugins/install -H 'Content-Type: application/json' -d '{
  "pluginId":"dsh-java-docker-plugin","jarName":"dsh-java-docker-plugin-0.1.0.jar",
  "displayName":"Docker Lens","pluginVersion":"0.1.0","runtimeType":"JAVA_NATIVE",
  "sourcePath":"<abs-path>/dsh-java-docker-plugin-0.1.0.jar",
  "entrypoint":"cn.xiaofuge.dsh.dk.plugin.DshDockerPlugin","installMode":"COPY"}'
curl --noproxy '*' -X POST http://127.0.0.1:8090/api/harness/plugins/activate -H 'Content-Type: application/json' \
  -d '{"pluginId":"dsh-java-docker-plugin"}'

# 3. 打开 http://127.0.0.1:8111

E2E

docker_lens_e2e.py — 8 用例 / 19 断言,全部通过(本机无 Docker daemon,降级路径真实覆盖):

用例 验证点
T0 镜像清单:daemon 不可用时优雅降级(reason + advice)
T1 容器清单:同样优雅降级
T2 lint 命中 EXPOSE 99999 / 缺 CMD / root 运行;好的 Dockerfile 0~1 问题
T3 瘦身建议:latest 固定版本 + apt 清理提示
T4 端口冲突图:web/api 抢 8080 被检出
T5 空 Dockerfile → 400
T6 AI 调用 dk_dockerfile_lint(SSE step_break 断言)
T7 AI 对 stop/rm 请求明确只读红线(不执行写操作)

截图

  • screenshots/01-home.png — Docker 体检镜首页
  • screenshots/02-ai-drawer.png — AI 对话体检(调用 dk_* 工具)
  • screenshots/03-safety.png — Dockerfile lint(纯文本分析,不执行 build)

About

DSH Docker Lens: 镜像容器清单/体积瘦身/dockerfile lint/端口冲突图 - Java Native Plugin 独立 AI 产品,不 stop/rm 容器

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages