BunDocker容器化部署 BunDocker

这个技能专注于使用Docker容器化Bun应用程序,涵盖从基础Dockerfile编写到高级多阶段构建、Docker Compose配置、安全最佳实践等,适用于云计算环境下的微服务部署。关键词:Bun, Docker, 容器化, 部署, 微服务, 云计算, DevOps。

Docker/K8s 0 次安装 0 次浏览 更新于 3/8/2026

名称: 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部署
  • 水平扩展
  • 服务网格