هر تیم application یک Dockerfile دارد — یا بدتر: کپی از Dockerfile همکار که «کار میکرد». نسخه base image قدیمی، RUN apt-get بدون patch، secret در layer، و کسی نمیداند داخل image چه هست.
Cloud Native Buildpacks (CNB) رویکرد دیگری است:
Transform your application source code into images that can run on any cloud.
یعنی buildpackها — نه developer — تصمیم میگیرند چگونه dependency نصب، compile، و لایههای image ساخته شوند. platform team یک builder تأییدشده تعریف میکند؛ developer فقط pack build یا git push میزند.
پروژه CNCF Graduated (۲۰۲۶) — از ریشه Pivotal و Heroku (۲۰۱۸) تا امروز با Paketo، Google، Salesforce و صدها سازمان enterprise.
مشکل Dockerfile-per-app
Developer A: FROM node:14 ← EOL
Developer B: FROM node:20-alpine ← OK
Developer C: COPY . . && npm i ← layer بزرگ، cache شکسته
Platform: «همه image را scan کنید» → 400 Dockerfile متفاوت| مشکل | پیامد |
|---|---|
| Dockerfile پراکنده | استاندارد امنیتی یکسان نیست |
| base image دستی | CVE patch دیر |
| دانش build در head | bus factor |
| layer غیرقابل cache | CI کند |
| SBOM ناقص | compliance سخت |
CNB دانش build را در buildpack + builder متمرکز میکند — یک بار upgrade، همه appها بهروز.
Cloud Native Buildpacks چیست؟
Cloud Native Buildpacks شامل:
- Specification — Platform API، Buildpack API، Distribution API (github.com/buildpacks/spec)
- Lifecycle — موتور فازهای build
- pack — CLI مرجع برای developer و operator
- Registry — کشف buildpackهای community (registry.buildpacks.io)
- Integrations — kpack، Tekton، GitLab Auto DevOps، CircleCI orb
سه نقش (persona)
| نقش | کار | ابزار |
|---|---|---|
| App Developer | git push → image | pack build |
| Buildpack Author | زبان/framework جدید | buildpack API |
| Platform Operator | builder سازمانی، policy | builder image، kpack |
چرا CNB؟ (از buildpacks.io)
| ارزش | توضیح |
|---|---|
| Control | تعادل بین dev agility و operator policy |
| Compliance | image از builder تأییدشده — SBOM، scan قابل پیشبینی |
| Maintainability | upgrade JDK/Node/OS در builder — نه 200 Dockerfile |
معماری: از source به OCI image
نمای کلی
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ App Source │ ──► │ Platform │ ──► │ OCI Image │
│ (git/local) │ │ pack / kpack │ │ (registry) │
└─────────────┘ └──────┬───────┘ └─────────────┘
│
┌──────▼───────┐
│ Builder │
│ = stack + │
│ buildpacks │
└──────┬───────┘
│
┌──────▼───────┐
│ Lifecycle │
│ (phases) │
└──────────────┘مفاهیم کلیدی
| مفهوم | توضیح |
|---|---|
| Buildpack | ماژولی که یک concern را handle میکند (مثلاً npm install، maven package) |
| Builder | image از پیش ساخته = stack + ordered buildpacks |
| Stack | build image + run image (OS + libc) |
| Order Group | ترتیب buildpackها برای detect |
| Launch | launcher + process types (web, worker) |
Lifecycle phases
طبق مستندات lifecycle:
| فاز | کار |
|---|---|
| analyze | بررسی image قبلی برای cache/reuse |
| detect | انتخاب buildpack group مناسب (مثلاً Node vs Java) |
| restore | restore cache layerها |
| build | اجرای buildpackها — compile، dependency |
| export | ساخت OCI image نهایی + launch metadata |
Platform میتواند /cnb/lifecycle/creator را یکجا صدا بزند یا هر فاز را جدا — برای CI بدون Docker daemon (مثل GitLab K8s runner).
pack CLI — شروع سریع
نصب: install-pack
# ساخت image از سورس محلی
pack build my-app \
--builder paketobuildpacks/builder-jammy-base \
--path ./my-node-app
# اجرا
docker run -p 8080:8080 my-appBuilderهای رایج
| Builder | مناسب برای |
|---|---|
| Paketo Jammy Base | Java، Node، Python، Go، .NET — production |
| Paketo Jammy Full | وقتی به package سیستمی بیشتر نیاز دارید |
| Heroku builders | سازگاری Heroku-style |
| Google Cloud Buildpacks | GCP Cloud Run / GKE |
Detect خودکار
Buildpackها فایلهای marker را چک میکنند:
package.json→ Node.js buildpackpom.xml/build.gradle→ Javarequirements.txt/pyproject.toml→ Pythongo.mod→ Go
Developer زبان را declare نمیکند — detect میکند.
مثال: Node.js بدون Dockerfile
mkdir hello-cnb && cd hello-cnb
cat > package.json << 'EOF'
{
"name": "hello-cnb",
"scripts": { "start": "node server.js" }
}
EOF
cat > server.js << 'EOF'
const http = require('http');
http.createServer((_, res) => {
res.end('Hello from Cloud Native Buildpacks!');
}).listen(process.env.PORT || 8080);
EOF
pack build hello-cnb \
--builder paketobuildpacks/builder-jammy-base \
--env BP_NODE_VERSION=20
docker run -p 8080:8080 hello-cnbBuildpack:
- Node engine نصب میکند
npm install(یاnpm ciبا lockfile)- launch process
web=npm startتعریف میکند - image با non-root user و minimal run image export میشود
تنظیم build با environment variables
Paketo و buildpackهای دیگر با prefix BP_* configure میشوند:
pack build my-java-app \
--builder paketobuildpacks/builder-jammy-base \
--env BP_JVM_VERSION=21 \
--env BP_MAVEN_BUILD_ARGUMENTS="-Dmaven.test.skip=true"برای lifecycle مستقیم (بدون pack)، متغیرها در platform/env/ فایل میشوند (راهنما).
kpack — CNB روی Kubernetes
kpack پیادهسازی Kubernetes-native است:
- CRD:
Image،Builder،ClusterBuilder،ClusterStore - build بدون privileged Docker — با unprivileged K8s primitives
- rebuild خودکار وقتی git commit یا builder عوض شود
apiVersion: kpack.io/v1alpha2
kind: Image
metadata:
name: my-app
namespace: default
spec:
tag: registry.example.com/my-app
serviceAccountName: kpack-service-account
builder:
name: default-builder
kind: ClusterBuilder
source:
git:
url: https://github.com/org/my-app.git
revision: mainمناسب platform operator که میخواهد هر namespace با builder استاندارد سازمان image بسازد.
یکپارچهسازی CI/CD
| پلتفرم | نحوه |
|---|---|
| Tekton | Buildpacks Phases Task — lifecycle per phase |
| GitLab Auto DevOps | pack داخلی |
| CircleCI | CNB orb |
| Argo Workflows | step با pack build یا lifecycle |
| GitHub Actions | pack-action community |
جریان GitOps (Argo CD):
git push → CI (pack/kpack) → push image to registry
→ update manifest tag در GitOps repo
→ Argo CD syncBuildpack vs Dockerfile vs Kaniko
| معیار | Dockerfile | Kaniko | Cloud Native Buildpacks |
|---|---|---|---|
| کنترل دقیق | ✅ کامل | ✅ | محدود به buildpack |
| نگهداری per-app | ❌ زیاد | ❌ Dockerfile | ✅ کم |
| Detect زبان | ❌ | ❌ | ✅ |
| Cache هوشمند | دستی | layer cache | ✅ restore/export |
| Compliance متمرکز | ❌ | ❌ | ✅ builder |
| Custom OS package | ✅ | ✅ | محدود (stack) |
| SBOM | دستی | دستی | ✅ built-in (Paketo) |
CNB برنده میشود وقتی صدها app مشابه (Java/Node/Python) دارید و platform team میخواهد policy یکسان.
Dockerfile برنده میشود وقتی app عجیب، multi-stage پیچیده، یا binary custom دارید.
چه زمانی CNB استفاده کنیم؟
✅ مناسب
- Platform team با دهها/صدها microservice
- استاندارد Java / Node / Python / Go enterprise
- Patch امنیتی متمرکز — upgrade builder = همه appها
- Heroku-style developer experience روی K8s
- CI بدون Docker socket (lifecycle در container)
- Reproducible build و audit
❌ کمتر مناسب
| وضعیت | جایگزین |
|---|---|
| app با Dockerfile بهینهشده خاص | Dockerfile + Kaniko |
| سیستمعامل یا package غیراستاندارد | custom Dockerfile |
| static site ساده (Astro/Hugo) | nginx image + copy dist/ |
| تیم ۲ نفره، ۳ app | Dockerfile ساده کافی است |
| نیاز به control کامل هر layer | Dockerfile |
برای سایتهای static مثل P30Light (Astro) معمولاً build در CI + copy به nginx سادهتر از CNB است — CNB برای application server (Node/Java/…) shine میکند.
امنیت و compliance
- Non-root run image در builderهای مدرن (Paketo)
- Minimal run image — فقط runtime لازم (JRE نه JDK، مگر configure)
- Rebase —
pack rebaseبرای swap run image بدون rebuild کامل - SBOM — Paketo با Syft integration
- Scanner — image قابل پیشبینی → Trivy/Grype مؤثرتر
- Provenance — build reproducible از builder pin شده
Operator میتواند فقط builderهای internal registry را allow کند — developer نمیتواند FROM random/image بزند.
نوشتن buildpack سفارشی
برای زبان یا framework داخلی: How to write a basic buildpack
خلاصه:
- detect — آیا این buildpack روی app اعمال میشود؟
- build — dependency + compile
- export — layer به contribution
سپس در builder.toml به builder اضافه کنید و publish به registry داخلی.
عملیات روزمره
# لیست builderهای local
pack builder suggest
# inspect builder
pack inspect-builder paketobuildpacks/builder-jammy-base
# build با cache
pack build my-app --builder paketobuildpacks/builder-jammy-base --path .
# rebase پس از patch OS
pack rebase my-app:latest --run-image paketobuildpacks/run-jammy-base:latest
# pull و update builder
pack builder pull paketobuildpacks/builder-jammy-baseCNB در کنار stack مدرن
Developer git push
│
▼
┌──────────────┐ ┌─────────────┐ ┌──────────────┐
│ kpack / pack │ ──► │ Registry │ ──► │ Kubernetes │
│ (CNB build) │ │ (Harbor/ECR)│ │ Deployment │
└──────────────┘ └─────────────┘ └──────────────┘
▲ │
│ GitOps (Argo CD) │
└──────── manifest tag update ◄──────────┘- شبکه pod: Kube-OVN
- runtime امن: Kata Containers (اختیاری)
- CI workflow: Argo Workflows
جمعبندی
| بدون CNB | با CNB |
|---|---|
| N Dockerfile | 1 builder برای N app |
| «چه نسخه JDK؟» per team | مرکز platform |
| patch دستی | rebase builder |
| detect دستی base image | lifecycle استاندارد |
| دانش در head | buildpack در Git |
Cloud Native Buildpacks برای سازمانهایی است که developer velocity میخواهند ولی control، compliance و maintainability را قربانی نمیکنند — همان وعده Heroku، حالا OCI-standard و CNCF Graduated روی هر cloud.
قدم بعدی
packنصب کنید و tutorial رسمی را بزنید- یک app Node/Java با
paketobuildpacks/builder-jammy-basebuild کنید pack inspect-image— ببینید launch process و layerها چیست- در staging kpack نصب کنید و
ImageCRD تست کنید - builder سازمانی pin کنید — developer فقط از همان builder استفاده کند
منابع:
- Cloud Native Buildpacks — Official Site
- Documentation
- App Journey Tutorial
- Lifecycle Tutorial
- pack CLI (GitHub)
- kpack (Kubernetes)
- Paketo Buildpacks
- Buildpack Registry
- CNCF Specification
منتشر شده در P30Light — بخش زیرساخت سرور و Cloud Native.