نسخه آنلاین در حال بارگذاری زمان... تهران: ۲۶°C
۲۸ کاربر آنلاین

PNo.30Light

نشریه تخصصی هوش مصنوعی، سیستم‌های سرور و مهندسی داده

تازه ترین‌ها
زیرساخت و سرور
زمان مطالعه: ۱۸ دقیقه ۰ بازدید

Cloud Native Buildpacks: ساخت image بدون Dockerfile — راهنمای کامل CNB

نویسنده: تحریریه فنی P30Light
Cloud Native Buildpacks: ساخت image بدون Dockerfile — راهنمای کامل CNB
✦ خلاصه نکات کلیدی مقاله
  • CNB سورس کد را به OCI image تبدیل می‌کند — بدون Dockerfile؛ دانش build در buildpack متمرکز می‌شود نه در هر تیم.
  • lifecycle: analyze → detect → restore → build → export — reproducible و cache-friendly.
  • پروژه CNCF Graduated (۲۰۲۶) — pack برای dev، kpack برای Kubernetes، Paketo برای Java/Node/Python.

هر تیم 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 در headbus factor
layer غیرقابل cacheCI کند
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 Developergit push → imagepack build
Buildpack Authorزبان/framework جدیدbuildpack API
Platform Operatorbuilder سازمانی، policybuilder image، kpack

چرا CNB؟ (از buildpacks.io)

ارزشتوضیح
Controlتعادل بین dev agility و operator policy
Complianceimage از builder تأییدشده — SBOM، scan قابل پیش‌بینی
Maintainabilityupgrade 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)
Builderimage از پیش ساخته = stack + ordered buildpacks
Stackbuild image + run image (OS + libc)
Order Groupترتیب buildpackها برای detect
Launchlauncher + process types (web, worker)

Lifecycle phases

طبق مستندات lifecycle:

فازکار
analyzeبررسی image قبلی برای cache/reuse
detectانتخاب buildpack group مناسب (مثلاً Node vs Java)
restorerestore 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-app

Builderهای رایج

Builderمناسب برای
Paketo Jammy BaseJava، Node، Python، Go، .NET — production
Paketo Jammy Fullوقتی به package سیستمی بیشتر نیاز دارید
Heroku buildersسازگاری Heroku-style
Google Cloud BuildpacksGCP Cloud Run / GKE

Detect خودکار

Buildpackها فایل‌های marker را چک می‌کنند:

  • package.json → Node.js buildpack
  • pom.xml / build.gradle → Java
  • requirements.txt / pyproject.toml → Python
  • go.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-cnb

Buildpack:

  1. Node engine نصب می‌کند
  2. npm install (یا npm ci با lockfile)
  3. launch process web = npm start تعریف می‌کند
  4. 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

از مستندات buildpacks.io:

پلتفرمنحوه
TektonBuildpacks Phases Task — lifecycle per phase
GitLab Auto DevOpspack داخلی
CircleCICNB orb
Argo Workflowsstep با pack build یا lifecycle
GitHub Actionspack-action community

جریان GitOps (Argo CD):

git push → CI (pack/kpack) → push image to registry
                            → update manifest tag در GitOps repo
                            → Argo CD sync

Buildpack vs Dockerfile vs Kaniko

معیارDockerfileKanikoCloud 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/
تیم ۲ نفره، ۳ appDockerfile ساده کافی است
نیاز به control کامل هر layerDockerfile

برای سایت‌های 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)
  • Rebasepack 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

خلاصه:

  1. detect — آیا این buildpack روی app اعمال می‌شود؟
  2. build — dependency + compile
  3. 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-base

CNB در کنار stack مدرن

Developer git push


┌──────────────┐     ┌─────────────┐     ┌──────────────┐
│ kpack / pack │ ──► │  Registry   │ ──► │ Kubernetes   │
│  (CNB build) │     │ (Harbor/ECR)│     │ Deployment   │
└──────────────┘     └─────────────┘     └──────────────┘
       ▲                                        │
       │         GitOps (Argo CD)               │
       └──────── manifest tag update ◄──────────┘

جمع‌بندی

بدون CNBبا CNB
N Dockerfile1 builder برای N app
«چه نسخه JDK؟» per teamمرکز platform
patch دستیrebase builder
detect دستی base imagelifecycle استاندارد
دانش در headbuildpack در Git

Cloud Native Buildpacks برای سازمان‌هایی است که developer velocity می‌خواهند ولی control، compliance و maintainability را قربانی نمی‌کنند — همان وعده Heroku، حالا OCI-standard و CNCF Graduated روی هر cloud.

قدم بعدی

  1. pack نصب کنید و tutorial رسمی را بزنید
  2. یک app Node/Java با paketobuildpacks/builder-jammy-base build کنید
  3. pack inspect-image — ببینید launch process و layerها چیست
  4. در staging kpack نصب کنید و Image CRD تست کنید
  5. builder سازمانی pin کنید — developer فقط از همان builder استفاده کند

منابع:


منتشر شده در P30Light — بخش زیرساخت سرور و Cloud Native.

لینک گزارش با موفقیت کپی گردید!