# Docker 部署
Run Anywhere
Flyfish Viewer 可以作为纯静态预览站点打进 Docker 镜像,通过 nginx 托管构建后的 Demo。
镜像内同时包含主预览入口 / 和文档比对入口 /compare.html,适合内网、私有云和客户现场一键部署。
## Docker Hub 一键运行
镜像发布后使用多架构 manifest,覆盖 `linux/amd64` 和 `linux/arm64`:
```bash
docker run -d \
--name flyfish-viewer \
--restart unless-stopped \
-p 8080:80 \
flyfishdev/file-viewer:latest
```
打开:
- 主预览: `http://localhost:8080/`
- 文档比对: `http://localhost:8080/compare.html`
- 健康检查: `http://localhost:8080/healthz`
如果你希望始终使用最新稳定版本:
```bash
docker run -d \
--name flyfish-viewer \
--restart unless-stopped \
-p 8080:80 \
flyfishdev/file-viewer:latest
```
## Docker Compose
```yaml
services:
flyfish-viewer:
image: flyfishdev/file-viewer:latest
container_name: flyfish-viewer
restart: unless-stopped
ports:
- "8080:80"
healthcheck:
test: ["CMD", "wget", "-qO-", "http://127.0.0.1/healthz"]
interval: 30s
timeout: 3s
retries: 3
```
启动:
```bash
docker compose up -d
```
## 本地构建镜像
源码仓库内提供标准 `Dockerfile`。本地只构建当前 CPU 架构并加载到 Docker:
```bash
pnpm docker:build
```
默认镜像名是 `flyfishdev/file-viewer`,标签为当前 `package.json` 版本和 `latest`。如需改成自己的命名空间:
```bash
DOCKER_IMAGE=your-org/file-viewer pnpm docker:build
```
本地运行:
```bash
docker run --rm -p 8080:80 flyfishdev/file-viewer:latest
```
## 通过 Docker Hub API 创建仓库
发布前先准备 Docker Hub Personal Access Token。仓库创建使用 Docker Hub API,镜像上传使用 Docker Registry 推送链路:
```bash
DOCKER_IMAGE=flyfishdev/file-viewer \
DOCKERHUB_USERNAME=your-dockerhub-user \
DOCKERHUB_TOKEN=dckr_pat_xxx \
pnpm docker:repo:create
```
脚本会先检查目标仓库是否存在;如果不存在,会调用 Docker Hub API 创建公开仓库。
## 多架构推送到 Docker Hub
仓库创建完成后登录 Docker Hub,并确认当前账号对目标 namespace 有推送权限。如果使用自己的命名空间,请把 `DOCKER_IMAGE` 改成对应仓库名:
```bash
docker login
```
推送 `linux/amd64` 和 `linux/arm64`:
```bash
DOCKER_IMAGE=flyfishdev/file-viewer pnpm docker:publish
```
脚本默认推送稳定入口标签:
- `flyfishdev/file-viewer:latest`
如需覆盖平台或同时推送明确版本号,可以显式传入标签:
```bash
DOCKER_IMAGE=flyfishdev/file-viewer \
DOCKER_PLATFORMS=linux/amd64,linux/arm64 \
DOCKER_TAGS=2.x.x,latest \
pnpm docker:publish
```
## 镜像内容
Docker 镜像只包含构建后的静态产物,不携带源码工作区:
- `/usr/share/nginx/html/index.html`: 主预览入口
- `/usr/share/nginx/html/compare.html`: 文档比对入口
- `/usr/share/nginx/html/assets/*`: Vite hash 资源
- `/usr/share/nginx/html/example/*`: 示例文件
- `/usr/share/nginx/html/vendor/*`: Worker / WASM 等静态资源
nginx 配置会对 HTML 使用 `max-age=0, must-revalidate`,对 hash 资源和 vendor 资源使用长缓存,避免旧入口页引用已经不存在的异步 chunk。
## 反向代理建议
如果容器前面还有网关或统一域名,建议保持以下路径不被重写:
- `/`
- `/compare.html`
- `/assets/*`
- `/vendor/*`
- `/example/*`
示例文件、WASM 和 Worker 都是静态资源;如果网关把缺失的 `.js` 或 `.wasm` 回退成 HTML,浏览器会触发 MIME 错误。生产环境请让这些资源缺失时返回真实 `404`。