ساخت و انتشار Image با Docker و Registry
هر Application یک Repository اختصاصی برای نگهداری Imageهای قابل انتشار دارد. مسیر درست کار این است: Image را روی دستگاه توسعه یا Runner سامانه CI بسازید، آن را در Repository همان Application Push کنید، نتیجه Scan را بررسی کنید و سپس Artifact را برای Workload GitOps انتخاب کنید.
این اطلاعات را از کجا بگیرم؟
- وارد کوبرنتیز ابری ← Applicationها شوید.
- Application موردنظر را باز کنید.
- از بخش نمای کلی Application، مقدار Repository را ببینید.
- دکمه Rotate Credential را انتخاب کنید.
- در Dialog بازشده، Registry URL، Project، Repository، Username و Secret را در Secret Store سیستم CI ذخیره کنید.
پس از بستن 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 باید به همین ترتیب باشند:
- دریافت کد و اجرای Testها
- Docker Login با
--password-stdin - Docker Build با Tag نسخهدار
- Docker Push
- انتظار برای دیدهشدن Artifact در Application
- اجرای یا بررسی Scan امنیتی
- انتخاب 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 کجا دیده میشود؟
- به جزئیات همان Application برگردید.
- در جدول Artifactهای Registry، Tag و Digest جدید را جستوجو کنید.
- روی Artifact، جزئیات و گزارش Scan امنیتی را بررسی کنید.
- در ایجاد یا ویرایش Workload با Delivery Mode برابر GitOps، همان Application و Artifact تأییدشده را انتخاب کنید.
- وضعیت 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 یا Push | Credential منقضی یا اشتباه است | 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 شده است.