feat: Alpine 多阶段 Docker 镜像,支持 amd64/arm64 musl 构建
This commit is contained in:
@@ -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 跨平台发布
|
||||
|
||||
#### 发布命令
|
||||
|
||||
|
||||
Reference in New Issue
Block a user