bun-deploy について
Bun アプリを Docker にデプロイする手順を案内するスキルです。イメージ方式の選択からコンテナのテストまで扱い、Kubernetes、CI/CD、マルチプラットフォームビルドの資料も含みます。
主な機能
- 01マルチステージとバイナリのイメージ構成
- 02各種プロジェクト向け Dockerfile テンプレート
- 03ヘルスチェックと非 root 設定
- 04Kubernetes デプロイのガイド
- 05CI/CD とマルチプラットフォームビルドの資料
活用シーン
- 01Bun の Web サーバーや API をパッケージ化
- 02小さな本番コンテナを作成
- 03Kubernetes のデプロイファイルを準備
- 04ARM64 と AMD64 向けのイメージをビルド
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ daleseo/ bun-skills --skill bun-deployインストール後、Claude Code で/bun-deployを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/ci-cd.mddockerfile-templates.mdkubernetes.mdmulti-platform.md詳細
Bun Docker デプロイ
Bun アプリケーション向けに最適化された Docker イメージを作成します。Bun の軽量なランタイムとバイナリコンパイルにより、Node.js と比較してイメージサイズを 88MB 以上削減できます。
クイックリファレンス
詳しいパターンについては、以下を参照してください。
- Dockerfile テンプレート:dockerfile-templates.md - 最適化されたテンプレートを 12 種類以上掲載
- Kubernetes:kubernetes.md - K8s マニフェスト、HPA、Ingress
- CI/CD:ci-cd.md - GitHub Actions、GitLab CI、ビルドスクリプト
- マルチプラットフォーム:multi-platform.md - ARM64/AMD64 ビルド
基本的なワークフロー
1. 前提条件を確認する
# Verify Docker is installed
docker --version
# Verify Bun is installed locally
bun --version
# Check if project is ready for deployment
ls -la package.json bun.lockb
2. デプロイ戦略を決定する
必要な内容をユーザーに確認します。
- アプリケーションの種類:Web サーバー、API、ワーカー、CLI
- イメージサイズの優先度:最小サイズ(40MB のバイナリ)またはデバッグツール(90MB の Alpine)
- プラットフォーム:単一プラットフォームまたはマルチプラットフォーム(AMD64 + ARM64)
- オーケストレーション:Docker Compose、Kubernetes、またはスタンドアロンコンテナ
3. 本番用 Dockerfile を作成する
ニーズに応じた適切なテンプレートを選択します。
標準的なマルチステージ構成(推奨)
# syntax=docker/dockerfile:1
FROM oven/bun:1-alpine AS deps
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile --production
FROM oven/bun:1-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN bun run build
FROM oven/bun:1-alpine AS runtime
WORKDIR /app
RUN addgroup --system --gid 1001 bunuser && \
adduser --system --uid 1001 bunuser
COPY --from=deps --chown=bunuser:bunuser /app/node_modules ./node_modules
COPY --from=builder --chown=bunuser:bunuser /app/dist ./dist
COPY --from=builder --chown=bunuser:bunuser /app/package.json ./
USER bunuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD bun run healthcheck.ts || exit 1
CMD ["bun", "run", "dist/index.js"]
最小バイナリ(40MB)
可能な限り小さいイメージにする場合:
FROM oven/bun:1-alpine AS builder
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
COPY . .
RUN bun build ./src/index.ts --compile --outfile server
FROM gcr.io/distroless/base-debian12
COPY --from=builder /app/server /server
EXPOSE 3000
ENTRYPOINT ["/server"]
その他のシナリオ(モノレポ、データベースアプリ、CLI ツールなど)については、dockerfile-templates.md を参照してください。
4. .dockerignore を作成する
node_modules
bun.lockb
dist
*.log
.git
.env
.env.local
tests/
*.test.ts
coverage/
.vscode/
.DS_Store
Dockerfile
docker-compose.yml
5. ヘルスチェック用スクリプトを作成する
healthcheck.ts を作成します。
#!/usr/bin/env bun
const port = process.env.PORT || 3000;
const healthEndpoint = process.env.HEALTH_ENDPOINT || '/health';
try {
const response = await fetch(`http://localhost:${port}${healthEndpoint}`, {
method: 'GET',
timeout: 2000,
});
if (response.ok) {
process.exit(0);
} else {
console.error(`Health check failed: ${response.status}`);
process.exit(1);
}
} catch (error) {
console.error('Health check error:', error);
process.exit(1);
}
サーバーにヘルスチェック用エンドポイントを追加します。
app.get('/health', (req, res) => {
res.json({
status: 'ok',
timestamp: Date.now(),
uptime: process.uptime(),
});
});
6. イメージをビルドしてテストする
# Build image
docker build -t myapp:latest .
# Check image size
docker images myapp:latest
# Run container
docker run -p 3000:3000 myapp:latest
# Test health endpoint
curl http://localhost:3000/health
7. 環境に合わせて設定する
Docker Compose を使ったローカル開発の場合:
docker-compose.yml を作成します。
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
depends_on:
- db
- redis
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
次のコマンドで実行します:docker-compose up
Kubernetes へのデプロイの場合:
以下を含む完全なマニフェストについては、kubernetes.md を参照してください。
- Deployment の設定
- Service と Ingress
- Secrets と ConfigMaps
- 水平 Pod オートスケーリング
- Bun 向けに最適化されたリソース制限
CI/CD の場合:
以下については、ci-cd.md を参照してください。
- GitHub Actions のワークフロー
- GitLab CI の設定
- ビルドおよびプッシュ用スクリプト
- 自動デプロイ
マルチプラットフォーム(ARM64 + AMD64)の場合:
以下については、multi-platform.md を参照してください。
- マルチプラットフォーム対応の Dockerfile
- Buildx の設定
- 異なるアーキテクチャでのテスト
8. package.json を更新する
Docker 用スクリプトを追加します。
{
"scripts": {
"docker:build": "docker build -t myapp:latest .",
"docker:run": "docker run -p 3000:3000 myapp:latest",
"docker:dev": "docker-compose up",
"docker:clean": "docker system prune -af"
}
}
イメージサイズの比較
Bun では、イメージサイズを大幅に小さくできます。
| 構成 | サイズ | 用途 |
|---|---|---|
| Bun バイナリ(distroless) | ~40 MB | 本番環境(最小構成) |
| Bun Alpine | ~90 MB | 本番環境(標準構成) |
| Node.js Alpine | ~180 MB | 比較基準 |
Bun なら 88MB 以上削減できます!
セキュリティのベストプラクティス
- 非 root ユーザーを使用する(上記の Dockerfile に含まれています)
- 脆弱性をスキャンする:
docker scan myapp:latest - 公式のベースイメージを使用する:
oven/bunは公式イメージです - イメージを最新の状態に保つ:最新の Bun で定期的に再ビルドします
- シークレットをハードコードしない:環境変数またはシークレットマネージャーを使用します
最適化のヒント
レイヤーキャッシュ:
# Copy dependencies first (changes less often)
COPY package.json bun.lockb ./
RUN bun install
# Copy source code last (changes more often)
COPY . .
RUN bun run build
レイヤー数の削減:
# Combine RUN commands
RUN bun install && \
bun run build && \
rm -rf tests/
最終イメージの最小化:
# Only copy what's needed in runtime
COPY --from=builder /app/dist ./dist
# Don't copy: src/, tests/, .git/, node_modules (if using binary)
完了チェックリスト
- ✅ Dockerfile を作成済み(マルチステージまたはバイナリ)
- ✅ .dockerignore を設定済み
- ✅ ヘルスチェックを実装済み
- ✅ 非 root ユーザーを設定済み
- ✅ イメージをビルドし、ローカルでテスト済み
- ✅ イメージサイズを確認済み(Alpine は <100MB、バイナリは <50MB)
- ✅ 環境設定を準備済み(docker-compose または K8s)
- ✅ CI/CD パイプラインを設定済み(必要な場合)
次のステップ
基本的なデプロイの後に、以下を行います。
- モニタリング:Prometheus のメトリクスエンドポイントを追加する
- ロギング:構造化ロギングを設定する
- シークレット:適切なシークレット管理を設定する
- スケーリング:水平 Pod オートスケーリングを設定する(K8s)
- CI/CD:ビルドとデプロイを自動化する
- マルチリージョン:冗長性のために複数のリージョンにデプロイする
詳しい実装については、上記のリンク先にあるリファレンスファイルを参照してください。