名称: Bun Docker 描述: 用于与Bun一起使用Docker、Dockerfile、oven/bun镜像、容器化和部署。 版本: 1.0.0
Bun Docker
使用官方镜像在Docker容器中部署Bun应用程序。
官方镜像
# 最新稳定版
docker pull oven/bun
# 特定版本
docker pull oven/bun:1.0.0
# 变体
oven/bun:latest # 完整镜像 (~100MB)
oven/bun:slim # 最小镜像 (~80MB)
oven/bun:alpine # Alpine基础镜像 (~50MB)
oven/bun:distroless # Distroless镜像 (~60MB)
oven/bun:debian # Debian基础镜像 (~100MB)
基础Dockerfile
FROM oven/bun:1 AS base
WORKDIR /app
# 安装依赖
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
# 复制源代码
COPY . .
# 运行
EXPOSE 3000
CMD ["bun", "run", "src/index.ts"]
多阶段构建(生产环境)
# 构建阶段
FROM oven/bun:1 AS builder
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
COPY . .
RUN bun run build
# 生产阶段
FROM oven/bun:1-slim AS production
WORKDIR /app
# 仅复制生产依赖
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile --production
# 复制构建后的资源
COPY --from=builder /app/dist ./dist
# 以非root用户运行
USER bun
EXPOSE 3000
CMD ["bun", "run", "dist/index.js"]
Alpine镜像
FROM oven/bun:1-alpine
WORKDIR /app
# Alpine使用apk安装包
RUN apk add --no-cache git
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
COPY . .
CMD ["bun", "run", "src/index.ts"]
Distroless镜像
# 构建阶段
FROM oven/bun:1 AS builder
WORKDIR /app
COPY . .
RUN bun install --frozen-lockfile
RUN bun build src/index.ts --compile --outfile=app
# 运行时阶段
FROM gcr.io/distroless/base
COPY --from=builder /app/app /app
ENTRYPOINT ["/app"]
Docker Compose
# docker-compose.yml
version: "3.8"
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://db:5432/app
depends_on:
- db
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: app
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
开发环境热重载
# docker-compose.dev.yml
version: "3.8"
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- ./src:/app/src
- ./package.json:/app/package.json
command: bun --hot run src/index.ts
# Dockerfile.dev
FROM oven/bun:1
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install
# 源代码作为卷挂载
CMD ["bun", "--hot", "run", "src/index.ts"]
编译二进制文件
FROM oven/bun:1 AS builder
WORKDIR /app
COPY . .
RUN bun install --frozen-lockfile
RUN bun build src/index.ts --compile --outfile=server
# 最小运行时
FROM ubuntu:22.04
# 安装运行时依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/server /usr/local/bin/server
USER nobody
EXPOSE 3000
CMD ["server"]
使用Docker的SQLite
FROM oven/bun:1
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
COPY . .
# 创建数据目录
RUN mkdir -p /app/data
# SQLite数据库卷
VOLUME /app/data
ENV DATABASE_PATH=/app/data/app.sqlite
CMD ["bun", "run", "src/index.ts"]
健康检查
FROM oven/bun:1
WORKDIR /app
COPY . .
RUN bun install --frozen-lockfile
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
CMD ["bun", "run", "src/index.ts"]
// 健康端点
app.get("/health", (c) => c.json({ status: "ok" }));
环境变量
FROM oven/bun:1
WORKDIR /app
# 构建时参数
ARG NODE_ENV=production
ARG API_URL
# 运行时环境变量
ENV NODE_ENV=${NODE_ENV}
ENV API_URL=${API_URL}
COPY . .
RUN bun install --frozen-lockfile
CMD ["bun", "run", "src/index.ts"]
# 使用参数构建
docker build --build-arg API_URL=https://api.example.com -t myapp .
# 使用环境变量运行
docker run -e DATABASE_URL=postgres://... myapp
缓存优化
FROM oven/bun:1 AS base
WORKDIR /app
# 单独缓存依赖
FROM base AS deps
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
# 构建
FROM deps AS builder
COPY . .
RUN bun run build
# 生产
FROM base AS runner
COPY --from=deps /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package.json ./
USER bun
CMD ["bun", "run", "dist/index.js"]
安全最佳实践
FROM oven/bun:1-slim
WORKDIR /app
# 不以root用户运行
USER bun
# 以正确的所有权复制
COPY --chown=bun:bun package.json bun.lockb ./
RUN bun install --frozen-lockfile --production
COPY --chown=bun:bun . .
# 只读文件系统
# (与docker run --read-only一起使用)
EXPOSE 3000
CMD ["bun", "run", "src/index.ts"]
.dockerignore
node_modules
.git
.gitignore
*.md
Dockerfile*
docker-compose*
.env*
.DS_Store
coverage
dist
.bun
常用命令
# 构建
docker build -t myapp .
# 运行
docker run -p 3000:3000 myapp
# 使用环境文件运行
docker run --env-file .env -p 3000:3000 myapp
# 交互式shell
docker run -it oven/bun sh
# 检查Bun版本
docker run oven/bun bun --version
常见错误
| 错误 | 原因 | 修复 |
|---|---|---|
bun.lockb not found |
缺少锁文件 | 本地运行 bun install |
EACCES permission |
文件所有权问题 | 使用 --chown=bun:bun |
OOM killed |
内存限制 | 增加容器内存 |
No space left |
层过大 | 使用多阶段构建 |
何时加载参考资料
加载 references/optimization.md 当:
- 镜像大小减少
- 层缓存
- 构建性能
加载 references/kubernetes.md 当:
- K8s部署
- 水平扩展
- 服务网格