Cloud Native Buildpacks(CNB)将应用源码自动转换为 OCI 容器镜像,无需编写 Dockerfile。它由 Heroku 和 Pivotal 于 2018 年联合发起,现为 CNCF 孵化项目。

核心概念

  • Buildpack:检测应用类型并贡献构建步骤的最小单元。例如 Java Buildpack 检测 pom.xml 并运行 Maven 构建。
  • Builder:一组 Buildpack 的组合 + 基础运行镜像。例如 paketobuildpacks/builder-jammy-base 包含 Java、Node.js、Go、Python 的 Buildpack。
  • Stack:构建镜像(build image)和运行镜像(run image)的组合。

与 Dockerfile 的对比

维度DockerfileBuildpacks
编写手动编写自动检测,无需编写
基础镜像手动选择和管理Builder 统一管理
安全更新需重建镜像可 rebase 运行镜像而不重编译应用
分层复用依赖 Docker layer cache自动分析依赖变化,精确复用
自定义完全自由可自定义 Buildpack
学习成本需了解 Linux/Shell/包管理零配置起步

快速开始

安装 pack CLI

# macOS
brew install buildpacks/tap/pack

# Linux
curl -sSL "https://github.com/buildpacks/pack/releases/latest/download/pack-linux.tgz" | sudo tar -C /usr/local/bin/ --no-same-owner -xzv pack

构建 Spring Boot 应用

# 克隆示例项目
git clone https://github.com/buildpacks/samples
cd samples/apps/java-maven

# 构建镜像
pack build myapp --builder paketobuildpacks/builder-jammy-base

# 运行
docker run -p 8080:8080 myapp

无需 Dockerfile,pack CLI 自动检测 pom.xml → 选择 Java Buildpack → 执行 Maven 构建 → 产出 OCI 镜像。

指定 Builder

# 使用 Google 的 Builder(针对 GCP 优化)
pack build myapp --builder gcr.io/buildpacks/builder

# 使用 Heroku 的 Builder
pack build myapp --builder heroku/builder:22

kpack:Kubernetes 原生 Buildpacks

kpack 将 Buildpacks 集成到 Kubernetes,通过 CRD 声明式管理镜像构建:

apiVersion: kpack.io/v1alpha2
kind: Image
metadata:
  name: myapp
spec:
  tag: harbor.example.com/apps/myapp
  builder:
    name: default
    kind: Builder
  source:
    git:
      url: https://github.com/myorg/myapp
      revision: main
  build:
    env:
      - name: BP_JVM_VERSION
        value: "21"

kpack 会监控 Git 仓库变化,自动触发构建并将镜像推送到 Registry。

常用 Buildpack 配置

通过环境变量定制构建行为:

环境变量用途
BP_JVM_VERSION指定 Java 版本(如 21
BP_MAVEN_BUILD_ARGUMENTS传递自定义 Maven 参数
BP_NODE_RUN_SCRIPTS指定 Node.js 构建脚本(如 build
BP_GO_TARGETSGo 编译目标路径

镜像 Rebase(安全更新的最佳实践)

Buildpacks 最独特的能力之一:在不重新编译应用的情况下,替换运行镜像来修复 CVE:

# 查看当前镜像的 run image
pack inspect-image myapp

# rebase 到新版本的 run image
pack rebase myapp --run-image paketobuildpacks/run-jammy-base:latest

Rebase 直接替换底层 OS 层,不改动应用层,几秒内完成,对 CI/CD 极其友好。

自定义 Buildpack

如果需要定制构建逻辑(如安装特定系统依赖),可编写自己的 Buildpack:

# 创建一个简单的 Buildpack
pack buildpack create myorg/my-buildpack

# 目录结构
my-buildpack/
├── buildpack.toml
└── bin/
    ├── detect    # 检测应用是否匹配此 Buildpack
    └── build     # 执行构建逻辑

detect 返回 0 表示匹配,build 负责实际的构建步骤。

适用场景

  • 标准化构建流程:不需要每个项目各自维护 Dockerfile。
  • 安全合规:通过 rebase 统一修复 OS 层 CVE,无需各项目重新构建。
  • 平台工程:kpack 让开发者推送代码即可获得镜像——无需理解 Dockerfile。

限制

  • 需要后端有 Docker Daemon(或 Kubernetes + kpack)。
  • 自定义构建逻辑不如 Dockerfile 灵活——对于复杂的系统依赖安装,可能需要编写自定义 Buildpack。
  • 国内构建需注意网络访问 GitHub/Registry 的速度问题,可配置镜像代理。