پرش به مطلب اصلی

ساخت و انتشار Image با Docker و Registry

هر Application یک Repository اختصاصی برای نگه‌داری Imageهای قابل انتشار دارد. مسیر درست کار این است: Image را روی دستگاه توسعه یا Runner سامانه CI بسازید، آن را در Repository همان Application Push کنید، نتیجه Scan را بررسی کنید و سپس Artifact را برای Workload GitOps انتخاب کنید.

این اطلاعات را از کجا بگیرم؟

  1. وارد کوبرنتیز ابری ← Applicationها شوید.
  2. Application موردنظر را باز کنید.
  3. از بخش نمای کلی Application، مقدار Repository را ببینید.
  4. دکمه Rotate Credential را انتخاب کنید.
  5. در Dialog بازشده، Registry URL، Project، Repository، Username و Secret را در Secret Store سیستم CI ذخیره کنید.
Credential ربات فقط یک‌بار نمایش داده می‌شود

پس از بستن Dialog، Secret قبلی دوباره نمایش داده نمی‌شود. اگر آن را ذخیره نکرده‌اید، Credential را Rotate کنید و مقدار جدید را در CI جایگزین کنید.

مفهوم مسیر Image

مقادیر نمایش‌داده‌شده در Dialog، مرجع Image را می‌سازند:

<Registry URL>/<Project>/<Repository>:<Tag>

نمونه فرضی:

registry.example.com/team-a/payment-api:1.4.0

اگر مقدار Repository در پنل از قبل شامل Project است، آن را دوباره به مسیر اضافه نکنید. مرجع نهایی باید دقیقاً با Repository نمایش‌داده‌شده برای همان Application مطابقت داشته باشد.

پیش‌نیاز Build

  • Docker Engine یا محیط سازگار با Docker روی دستگاه توسعه یا Runner نصب باشد.
  • در پوشه پروژه فایل Dockerfile وجود داشته باشد.
  • Credential ربات را از Dialog دریافت و در محیط امن نگه‌داری کرده باشید.
  • از Tag نسخه‌دار مانند 1.4.0 یا Commit کوتاه مانند sha-a12bc34 استفاده کنید.

برای GitOps در محیط Production از Tag برابر latest استفاده نکنید؛ این Tag قابل تکرار نیست و Backend نیز ممکن است آن را رد کند.

روش اول: ساخت روی دستگاه توسعه

متغیرها را با مقادیر واقعی Dialog جایگزین کنید:

export REGISTRY_URL="registry.example.com"
export PROJECT_NAME="team-a"
export REPOSITORY_NAME="payment-api"
export IMAGE_TAG="1.4.0"
export ROBOT_USERNAME="robot$team-a+payment-api"
export ROBOT_SECRET="<secret-from-dialog>"

export IMAGE_REF="${REGISTRY_URL}/${PROJECT_NAME}/${REPOSITORY_NAME}:${IMAGE_TAG}"

ابتدا Login کنید. Secret را مستقیم در history شل قرار ندهید:

printf '%s' "$ROBOT_SECRET" | docker login "$REGISTRY_URL" \
--username "$ROBOT_USERNAME" \
--password-stdin

در پوشه‌ای که Dockerfile قرار دارد، Image را Build و سپس Push کنید:

docker build --tag "$IMAGE_REF" .
docker push "$IMAGE_REF"

برای اطمینان، Image محلی را بررسی کنید:

docker image inspect "$IMAGE_REF"

روش دوم: اگر Image محلی از قبل ساخته شده است

اگر Image با نام دیگری ساخته شده، ابتدا آن را Tag کنید و سپس Push نمایید:

export SOURCE_IMAGE="payment-api:local"
export IMAGE_REF="registry.example.com/team-a/payment-api:1.4.0"

docker tag "$SOURCE_IMAGE" "$IMAGE_REF"
docker push "$IMAGE_REF"

روش سوم: در CI/CD

Credentialها را در Secret Store ابزار CI نگه دارید، نه در repository یا فایل Pipeline عمومی. نام متغیرهای پیشنهادی:

REGISTRY_URL
REGISTRY_USERNAME
REGISTRY_SECRET
IMAGE_REPOSITORY
IMAGE_TAG

گام‌های Pipeline باید به همین ترتیب باشند:

  1. دریافت کد و اجرای Testها
  2. Docker Login با --password-stdin
  3. Docker Build با Tag نسخه‌دار
  4. Docker Push
  5. انتظار برای دیده‌شدن Artifact در Application
  6. اجرای یا بررسی Scan امنیتی
  7. انتخاب Artifact در Workload GitOps و آغاز Sync

نمونه گام Shell:

printf '%s' "$REGISTRY_SECRET" | docker login "$REGISTRY_URL" \
--username "$REGISTRY_USERNAME" --password-stdin

docker build --tag "${IMAGE_REPOSITORY}:${IMAGE_TAG}" .
docker push "${IMAGE_REPOSITORY}:${IMAGE_TAG}"

Image پس از Push کجا دیده می‌شود؟

  1. به جزئیات همان Application برگردید.
  2. در جدول Artifactهای Registry، Tag و Digest جدید را جست‌وجو کنید.
  3. روی Artifact، جزئیات و گزارش Scan امنیتی را بررسی کنید.
  4. در ایجاد یا ویرایش Workload با Delivery Mode برابر GitOps، همان Application و Artifact تأییدشده را انتخاب کنید.
  5. وضعیت Sync و سلامت Workload را تا تکمیل Delivery کنترل کنید.

Push موفق به معنی انتشار فوری روی Cluster نیست. Artifact ابتدا در Registry نگه‌داری می‌شود؛ انتشار زمانی شروع می‌شود که آن Artifact در مسیر GitOps یک Workload انتخاب و Sync شود.

Build ساده با Dockerfile نمونه

نمونه کمینه برای یک Application Node.js:

FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

از Dockerfile متناسب با زبان و Runtime خود استفاده کنید. Port اعلام‌شده در Dockerfile باید با Portهای تعریف‌شده برای Workload و Service هم‌راستا باشد.

خطاهای رایج

خطاعلت محتملاقدام
unauthorized هنگام Login یا PushCredential منقضی یا اشتباه استCredential جدید بسازید و Secret Store را به‌روزرسانی کنید
denied برای Repositoryمسیر Image با Application یکی نیستRegistry، Project و Repository را از Dialog دوباره کپی کنید
Artifact در پنل دیده نمی‌شودPush کامل نشده یا Tag اشتباه استخروجی docker push و مرجع Image را بررسی و فهرست Artifact را Refresh کنید
Workload Image را Pull نمی‌کندArtifact یا Registry Secret درست انتخاب نشده استTag، Repository، Secret و Eventهای Pod را کنترل کنید
Scan Critical داردآسیب‌پذیری شناخته‌شده در Image وجود داردPackage یا Base Image را به‌روزرسانی و Image جدید Push کنید

چک‌لیست پیش از انتشار

  • Tag نسخه‌دار و غیر latest انتخاب شده است.
  • مرجع Image با Repository همان Application یکسان است.
  • Secret ربات فقط در Secret Store CI نگه‌داری می‌شود.
  • docker push با موفقیت تمام شده است.
  • Artifact و Digest در پنل دیده می‌شوند.
  • نتیجه Scan متناسب با سیاست امنیتی تیم بررسی شده است.
  • Workload GitOps با Artifact تأییدشده Sync شده است.