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、查端口冲突。
| 工具 | 作用 |
|---|---|
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:8111docker_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)