1
0
Files
DiAL/openspec/specs/container-image-packaging/spec.md
lanyuanxiaoyao cfca03b4d6 refactor: 规范审查与重组,合并细粒度规范,清理过时内容
- 合并 20+ 细粒度 spec 为粗粒度主题规范:dashboard、data-store、probe-engine、probe-api、probe-config 等
- 删除完全冗余规范:data-retention(被 probe-engine+data-store 覆盖)、backend-code-quality(DEVELOPMENT.md 已记录)
- 补充 http-checker 规范至完整标准(配置+执行+expect+校验+observation),匹配代码 440 行实现
- 清理 tcp/udp/llm checker 规范中已废弃 defaults 配置段的残留 Scenario
- 清理 checker-cohesion-structure 中的实现路径引用(src/server/...)
- 统一所有 spec 格式(## Purpose 开头,去除 # Capability/Title 形式)
- 更新 prompt-spec-review.md 审查提示文档
2026-05-22 18:55:18 +08:00

138 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Purpose
Provide Alpine-based multi-stage Docker container image packaging for DiAL, enabling containerized deployment with musl executables, minimal runtime dependencies, and documented build/run workflows.
## Requirements
### Requirement: Alpine 多阶段容器镜像构建
系统 SHALL 提供基于 Alpine 的多阶段 Dockerfile用于从源码构建 DiAL 容器镜像。构建阶段 SHALL 使用 Bun 官方 Alpine 镜像安装依赖并执行现有生产构建命令;运行阶段 SHALL 使用 Alpine 基础镜像并只复制生产运行所需产物。
#### Scenario: 构建容器镜像
- **WHEN** 开发者在项目根目录执行文档化的 Docker 构建命令
- **THEN** 镜像构建 SHALL 安装锁定依赖、执行 `bun run build`,并将生成的 `dist/dial-server` 复制到最终运行镜像
#### Scenario: 运行镜像不包含开发依赖
- **WHEN** Dockerfile 生成最终运行阶段
- **THEN** 最终运行阶段 SHALL NOT 复制源码目录、`node_modules``.build``dist/web` 到镜像中
### Requirement: Alpine musl executable 目标
系统 MUST 为 Alpine 运行阶段生成 musl Linux executable。Docker 构建 SHALL 根据 Docker 构建架构选择 `bun-linux-x64-musl``bun-linux-arm64-musl`,并将该目标传递给现有 Bun compile 流程。
#### Scenario: amd64 镜像构建
- **WHEN** Docker 构建目标架构为 `amd64`
- **THEN** 构建阶段 MUST 使用 `bun-linux-x64-musl` 作为 Bun compile target
#### Scenario: arm64 镜像构建
- **WHEN** Docker 构建目标架构为 `arm64`
- **THEN** 构建阶段 MUST 使用 `bun-linux-arm64-musl` 作为 Bun compile target
#### Scenario: 不支持的架构
- **WHEN** Docker 构建目标架构不是 `amd64``arm64`
- **THEN** 构建 MUST 失败并输出不支持该架构的错误
### Requirement: 容器运行环境边界
运行镜像 SHALL 提供 DiAL 运行必需的系统能力,包括 HTTPS CA 证书、ICMP checker 所需 `ping` 命令、Bun musl executable 所需运行库、时区数据、非 root 运行用户和可写数据目录。运行镜像 SHALL NOT 默认提供 CMD checker 可能依赖的业务命令环境。
#### Scenario: 基础系统包
- **WHEN** 最终运行镜像构建完成
- **THEN** 镜像 SHALL 包含 `ca-certificates``iputils-ping``libgcc``libstdc++``tzdata`
#### Scenario: 非 root 运行
- **WHEN** 容器启动 DiAL 进程
- **THEN** DiAL 进程 SHALL 以非 root 用户运行,并且该用户 SHALL 能写入 `/data/dial`
#### Scenario: CMD checker 额外命令不内置
- **WHEN** 用户需要通过 CMD checker 执行 `curl``dig``psql``mysql``redis-cli` 或自定义脚本依赖
- **THEN** 官方镜像 SHALL 要求用户通过派生镜像或运行环境自行提供这些命令
### Requirement: 容器默认启动约定
系统 SHALL 为容器镜像提供稳定的默认启动约定。镜像 SHALL 使用 `dial-server` executable 作为入口,默认配置文件路径 SHALL 为 `/etc/dial/probes.yaml`,默认服务端口 SHALL 暴露 `3000`
#### Scenario: 默认配置路径
- **WHEN** 用户不覆盖容器启动命令
- **THEN** 容器 SHALL 尝试使用 `/etc/dial/probes.yaml` 作为 DiAL YAML 配置文件路径启动
#### Scenario: 默认端口暴露
- **WHEN** 用户查看镜像元数据或使用文档化运行命令
- **THEN** 镜像 SHALL 暴露并映射 DiAL 默认 HTTP 端口 `3000`
### Requirement: 容器专用最小配置示例
系统 SHALL 提供容器专用最小配置示例,用于直接挂载到默认配置路径运行。该配置 SHALL 默认监听容器网络地址 `0.0.0.0`,默认端口为 `3000`,并将存储目录设置为 `/data/dial`
#### Scenario: 容器配置监听所有接口
- **WHEN** 用户使用容器专用配置示例启动 DiAL
- **THEN** DiAL SHALL 监听 `0.0.0.0:3000`,使宿主机端口映射可访问服务
#### Scenario: 容器配置持久化目录
- **WHEN** 用户使用容器专用配置示例启动 DiAL
- **THEN** SQLite 数据和默认日志 SHALL 写入 `/data/dial` 下的路径
#### Scenario: 容器配置避免额外命令依赖
- **WHEN** 用户使用容器专用配置示例启动 DiAL
- **THEN** 示例配置 SHALL NOT 包含依赖 Bun、Node.js 或额外系统命令的 CMD checker target
### Requirement: 容器健康检查
镜像 SHALL 提供 Docker HEALTHCHECK通过 Alpine 自带 `wget` 访问 DiAL `/health` 端点判断进程健康。健康检查 SHALL NOT 为此额外安装 `curl`
#### Scenario: 健康检查成功
- **WHEN** DiAL 在容器内启动并响应 `/health`
- **THEN** Docker HEALTHCHECK SHALL 通过 HTTP 请求 `/health` 成功返回健康状态
#### Scenario: 不额外安装 curl
- **WHEN** 最终运行镜像构建完成
- **THEN** 镜像 SHALL NOT 为健康检查目的安装 `curl`
### Requirement: Docker 构建上下文控制
系统 SHALL 提供 Docker 构建上下文忽略规则,避免将开发依赖、构建产物、本地数据、环境文件和工具状态复制进构建上下文。
#### Scenario: 忽略开发和构建产物
- **WHEN** Docker 构建上下文被发送给 Docker daemon
- **THEN** `node_modules``dist``.build``data`、本地环境文件和工具状态目录 SHALL 被忽略
### Requirement: Docker 使用文档
系统 SHALL 在项目文档中说明 Docker 镜像的构建、运行和扩展方式。文档 MUST 覆盖单架构构建、多架构 buildx 构建、配置挂载、数据卷、ICMP capability 和 CMD checker 派生镜像策略。
#### Scenario: 单架构 Docker 构建文档
- **WHEN** 用户阅读 Docker 部署说明
- **THEN** 文档 SHALL 提供在本机架构构建 Alpine 镜像的命令示例
#### Scenario: 多架构 buildx 文档
- **WHEN** 用户阅读 Docker 部署说明
- **THEN** 文档 SHALL 提供 `linux/amd64``linux/arm64` 的 buildx 构建命令示例
#### Scenario: ICMP capability 文档
- **WHEN** 用户需要在容器中运行 ICMP checker
- **THEN** 文档 MUST 明确说明运行容器时需要授予 `NET_RAW` capability
#### Scenario: CMD checker 派生镜像文档
- **WHEN** 用户需要 CMD checker 执行官方镜像未内置的命令
- **THEN** 文档 SHALL 提供通过派生镜像安装额外命令的示例