1
0

feat: Alpine 多阶段 Docker 镜像,支持 amd64/arm64 musl 构建

This commit is contained in:
2026-05-21 19:20:47 +08:00
parent 6ca8b36542
commit 6e53c8130d
6 changed files with 306 additions and 1 deletions

View File

@@ -1053,7 +1053,54 @@ bun run clean
# 清理 dist/ 构建产物、dist/release/ 发布产物和 .build/ 临时文件
```
### 3.4 跨平台发布
### 3.4 Docker 镜像
Docker 镜像使用 Alpine 多阶段构建,保持与生产单可执行文件交付模型一致:
```
oven/bun:1-alpine → bun install --frozen-lockfile
→ BUN_TARGET=bun-linux-*-musl bun run build
→ dist/dial-server
alpine → 仅复制 /usr/local/bin/dial-server
→ 安装 ca-certificates、iputils-ping、libgcc、libstdc++、tzdata
→ 使用非 root dial 用户运行
```
#### 架构目标映射
Dockerfile 通过 Docker 提供的 `TARGETARCH` 选择 Bun compile target
| `TARGETARCH` | `BUN_TARGET` | 说明 |
| ------------ | ---------------------- | ----------------- |
| `amd64` | `bun-linux-x64-musl` | Alpine x64 musl |
| `arm64` | `bun-linux-arm64-musl` | Alpine ARM64 musl |
不支持的架构必须在构建阶段失败,避免生成无法运行的镜像。
#### 运行时边界
- 最终镜像不复制源码、`node_modules``.build``dist/web`
- 默认入口为 `/usr/local/bin/dial-server`,默认配置路径为 `/etc/dial/probes.yaml`
- 容器示例配置为 `docker/probes.yaml`,默认监听 `0.0.0.0:3000`,数据目录为 `/data/dial`
- 健康检查使用 Alpine 自带 `wget` 请求 `/health`,不为健康检查安装 `curl`
- `libgcc``libstdc++` 是 Bun musl executable 在 Alpine 中运行所需的基础运行库
- ICMP checker 依赖镜像内置的 `iputils-ping`,运行容器时仍需要按需授予 `--cap-add=NET_RAW`
- CMD checker 的额外命令环境不进入官方镜像,用户需要 `curl``dig``psql` 等命令时通过派生镜像安装
#### 验证命令
```bash
bun run check
bun run build
docker build -t dial:alpine .
docker run --rm -p 3000:3000 -v dial-data:/data/dial dial:alpine
docker buildx build --platform linux/amd64,linux/arm64 -t dial:alpine .
```
如本地 Docker 环境不支持 buildx 或多架构模拟,需在变更记录中说明未执行原因。
### 3.5 跨平台发布
#### 发布命令