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

حذف ایمیج یا تگ ایمیج

ایمیج یا تگ خاصی محلی را حذف می‌کند و منابع مرتبط را پاک‌سازی می‌نماید.


🧩 دستور کلی

async removeAnImage(imageName, tagName = "latest")

شرح عملکرد

این متد ایمیج یا تگ مشخص شده را حذف می‌کند. شامل:

  • اعتبارسنجی پارامترهای ورودی (نام ایمیج، تگ)
  • دریافت لیست تگ‌های موجود
  • بررسی وجود تگ درخواستی
  • بررسی تضادهای وابستگی (conflict check)
  • حذف layer ایمیج
  • پاک‌سازی layer‌های غیرمورد‌استفاده
  • حذف رکورد از پایگاه داده
  • حذف دایرکتوری ایمیج اگر آخرین تگ بود
  • logging عملیات

مهم: اگر ایمیج وابستگی با تگ دیگر داشته باشد، حذف ناموفق خواهد بود. همچنین حذف ایمیج قابل بازگشت نیست.


ورودی‌ها

پارامترنوعاجباریتوضیح
imageNameStringبلهنام ایمیج (مثلاً alpine, nginx)
tagNameStringخیرنام تگ (پیش‌فرض: latest)

خروجی

نوع: String

پیام موفقیت:

removed latest tag of alpine

استثناها (Errors)

InvalidRemoveImageParameters (422)

پیام: "Invalid image name or tag name format."

زمان رخ دادن: نام ایمیج یا تگ نامعتبر باشد

جزئیات:

{
"type": "VALIDATION_ERROR",
"statusCode": 422,
"imageName": "invalid@name",
"tagName": "latest",
"error": "Image name contains invalid characters"
}

راهنمای حل:

  • نام ایمیج را بررسی کنید (فقط حروف، اعداد، '-', '_' مجاز)
  • تگ را بررسی کنید
  • فرمت صحیح: imageName:tagName یا imageName (default latest)

ListImageTagsFailure (500)

پیام: "Failed to list image tags from ImageManager."

زمان رخ دادن: خطا در دریافت لیست تگ‌های ایمیج

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "alpine",
"error": "Image service communication failed"
}

راهنمای حل:

  • سرویس ImageManager را بررسی کنید
  • اتصال registry را تأیید کنید
  • ایمیج موجود است یا خیر؟

ImageTagNotFound (404)

پیام: "Image tag not found."

زمان رخ دادن: تگ مشخص شده در ایمیج موجود نیست

جزئیات:

{
"type": "NOT_FOUND",
"statusCode": 404,
"imageName": "alpine",
"tagName": "v99.0",
"availableTags": ["latest", "3.18", "3.17"]
}

راهنمای حل:

  • لیست تگ‌های موجود را بررسی کنید
  • تگ صحیح را وارد کنید
  • listImages() استفاده کنید تا تگ‌ها را ببینید

ImageTagConflict (409)

پیام: "Cannot remove image tag due to dependency conflict."

زمان رخ دادن: تگ درخواستی وابستگی با تگ دیگر دارد

جزئیات:

{
"type": "INVALID_STATE_ERROR",
"statusCode": 409,
"imageName": "node",
"tagName": "latest",
"conflictsWith": "18",
"error": "latest has conflict with tag 18"
}

راهنمای حل:

  • ابتدا تگ‌های وابسته را حذف کنید
  • تگ‌های دیگر را بررسی کنید
  • وابستگی‌ها را از پایگاه داده مشاهده کنید

ImageDependencyCheckFailure (500)

پیام: "Failed to check image dependencies."

زمان رخ دادن: خطا در بررسی تضادهای وابستگی

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "ubuntu",
"tagName": "22.04",
"error": "Dependency check failed"
}

راهنمای حل:

  • ImageManager را restart کنید
  • لاگ‌های سیستم را بررسی کنید
  • عملیات را دوباره تلاش کنید

RemoveImageLayerFailure (500)

پیام: "Failed to remove image layer."

زمان رخ دادن: خطا در حذف layer ایمیج

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "nginx",
"tagName": "latest",
"error": "Layer removal operation failed"
}

راهنمای حل:

  • سرویس ImageManager را بررسی کنید
  • اجازه‌های فایل سیستم را تأیید کنید
  • فضای دیسک کافی است یا خیر؟

PruneLayersFailure (500)

پیام: "Failed to prune unused image layers."

زمان رخ دادن: خطا در پاک‌سازی layer‌های غیرمورد‌استفاده

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "mysql",
"tagName": "8.0",
"error": "Prune operation failed"
}

راهنمای حل:

  • سرویس ImageManager را restart کنید
  • لاگ‌های prune را بررسی کنید
  • وضعیت سیستم فایل را تأیید کنید

DeleteImageRecordFailure (500)

پیام: "Failed to delete image record from database."

زمان رخ دادن: خطا در حذف رکورد از پایگاه داده

جزئیات:

{
"type": "DB_ERROR",
"statusCode": 500,
"imageName": "postgres",
"tagName": "15",
"error": "Database write failed"
}

راهنمای حل:

  • اتصال دیتابیس را بررسی کنید
  • دیتابیس را restart کنید
  • transaction logs را بررسی کنید

RemoveImageDirectoryFailure (500)

پیام: "Failed to remove image directory."

زمان رخ دادن: خطا در حذف دایرکتوری ایمیج (آخرین تگ)

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "redis",
"error": "Directory removal operation failed"
}

راهنمای حل:

  • اجازه‌های فایل سیستم را بررسی کنید
  • فایل‌های باز شده را ببندید
  • دایرکتوری را دستی بررسی کنید

GenericFailure (500)

پیام: "Generic failure during image removal."

زمان رخ دادن: خطای عمومی

جزئیات:

{
"type": "GENERIC_ERROR",
"statusCode": 500,
"error": "Image removal failed"
}

راهنمای حل:

  • سیستم لاگ را بررسی کنید
  • تمام سرویس‌ها را restart کنید
  • دوباره تلاش کنید

مثال‌های استفاده

مثال 1: حذف تگ پیش‌فرض (latest)

const K3Core = require('k3-core');

(async () => {
const k3 = new K3Core();

try {
const result = await k3.imageCore.removeAnImage('alpine');
console.log(result);
// Output: removed latest tag of alpine
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 2: حذف تگ خاص

(async () => {
const k3 = new K3Core();

try {
const result = await k3.imageCore.removeAnImage('node', '18');
console.log(result);
// Output: removed 18 tag of node
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 3: حذف تگ و بررسی پیام

(async () => {
const k3 = new K3Core();

try {
const result = await k3.imageCore.removeAnImage('nginx', 'dev');

if (result.includes('image directory also removed')) {
console.log('تمام ایمیج حذف شد');
} else {
console.log('فقط تگ حذف شد');
}
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 4: حذف چند تگ

(async () => {
const k3 = new K3Core();

const tags = ['dev', '1.0', '1.1'];

for (const tag of tags) {
try {
const result = await k3.imageCore.removeAnImage('app', tag);
console.log(`${result}`);
} catch (error) {
if (error.type === 'CONFLICT') {
console.log(`${tag} وابستگی دارد: ${error.message}`);
} else if (error.type === 'NOT_FOUND') {
console.log(`${tag} پیدا نشد`);
} else {
console.log(`✗ خطا: ${error.message}`);
}
}
}
})();

مثال 5: حذف با بررسی تگ‌های موجود

(async () => {
const k3 = new K3Core();
const imageName = 'ubuntu';
const tagToRemove = '20.04';

try {
// بررسی تگ‌های موجود
const images = await k3.imageCore.listImages({ image: imageName });

const tagExists = images.some(img => img.Tag === tagToRemove);

if (!tagExists) {
console.log(`تگ ${tagToRemove} برای ${imageName} موجود نیست`);
console.log('تگ‌های موجود:');
images.forEach(img => console.log(` - ${img.Tag}`));
return;
}

// حذف تگ
const result = await k3.imageCore.removeAnImage(imageName, tagToRemove);
console.log(result);
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 6: حذف ایمیج کامل (تمام تگ‌ها)

(async () => {
const k3 = new K3Core();
const imageName = 'old-service';

try {
// دریافت تمام تگ‌ها
const images = await k3.imageCore.listImages({ image: imageName });

if (images.length === 0) {
console.log('ایمیج موجود نیست');
return;
}

console.log(`حذف ${images.length} تگ از ${imageName}...`);

// حذف همه تگ‌ها
for (const img of images) {
try {
const result = await k3.imageCore.removeAnImage(imageName, img.Tag);
console.log(`${result}`);
} catch (error) {
console.log(`✗ خطا در حذف ${img.Tag}: ${error.message}`);
}
}
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 8: حذف نوبتی و logging

(async () => {
const k3 = new K3Core();

const removeLog = [];

try {
// حذف تگ‌های dev قدیمی
const devTags = ['dev', 'dev-1.0', 'dev-1.1'];

for (const tag of devTags) {
try {
const result = await k3.imageCore.removeAnImage('app', tag);
removeLog.push({
status: 'success',
tag: tag,
message: result,
timestamp: new Date()
});
console.log(`${tag}: ${result}`);
} catch (error) {
removeLog.push({
status: 'failed',
tag: tag,
error: error.message,
timestamp: new Date()
});
console.log(`${tag}: ${error.message}`);
}
}

// گزارش نهایی
console.log('\nخلاصه:');
const successful = removeLog.filter(log => log.status === 'success').length;
const failed = removeLog.filter(log => log.status === 'failed').length;
console.log(` موفق: ${successful}`);
console.log(` ناموفق: ${failed}`);
} catch (error) {
console.log(error.createFullMessage());
}
})();

الگوهای خطا و راهنمای حل

الگو 1: تگ پیدا نشد

خطا: ImageTagNotFound (404)

راهنمای حل:

try {
await k3.imageCore.removeAnImage('alpine', 'v99.0');
} catch (error) {
if (error.type === 'NOT_FOUND') {
console.log('تگ موجود نیست');

// دریافت تگ‌های موجود
const images = await k3.imageCore.listImages({ image: 'alpine' });
console.log('تگ‌های موجود:');
images.forEach(img => console.log(` - ${img.Tag}`));

// حذف تگ درست
if (images.length > 0) {
await k3.imageCore.removeAnImage('alpine', images[0].Tag);
}
} else {
console.log(error.createFullMessage());
}
}

الگو 2: تضاد وابستگی

خطا: ImageTagConflict (409)

راهنمای حل:

const removeImageSafely = async (imageName, tagName) => {
try {
const result = await k3.imageCore.removeAnImage(imageName, tagName);
return { success: true, message: result };
} catch (error) {
if (error.type === 'CONFLICT') {
console.log(`${tagName} وابستگی با تگ‌های دیگر دارد`);

// دریافت همه تگ‌ها
const images = await k3.imageCore.listImages({ image: imageName });
console.log('سفارش حذف:');

// حذف تگ‌های وابسته اول
for (const img of images) {
if (img.Tag !== tagName) {
try {
await k3.imageCore.removeAnImage(imageName, img.Tag);
console.log(` ✓ حذف شد: ${img.Tag}`);
} catch (e) {
console.log(` ✗ نتوانست: ${img.Tag}`);
}
}
}

// سپس تگ اصلی
const finalResult = await k3.imageCore.removeAnImage(imageName, tagName);
return { success: true, message: finalResult };
}
throw error;
}
};

await removeImageSafely('node', 'latest');

الگو 3: بررسی قبل از حذف

راهنمای حل:

const removeImageWithValidation = async (imageName, tagName) => {
try {
// Step 1: بررسی وجود ایمیج
const images = await k3.imageCore.listImages({ image: imageName });

if (!images.some(img => img.Tag === tagName)) {
console.log(`ایمیج ${imageName}:${tagName} موجود نیست`);
return false;
}

// Step 2: بررسی استفاده (optional - اگر سیستم اجازه داده)
console.log(`حذف ${imageName}:${tagName}...`);

// Step 3: حذف
const result = await k3.imageCore.removeAnImage(imageName, tagName);
console.log(`${result}`);

// Step 4: تأیید حذف
const afterRemove = await k3.imageCore.listImages({ image: imageName, tag: tagName });

if (afterRemove.length === 0) {
console.log('تأیید: تگ با موفقیت حذف شد');
return true;
}
} catch (error) {
console.log(`✗ خطا: ${error.message}`);
return false;
}
};

const success = await removeImageWithValidation('nginx', 'latest');

نکات عملی

  1. پارامترهای اعتبار‌سنجی:

    • نام ایمیج: فقط حروف، اعداد، '-', '_'
    • تگ: فقط حروف، اعداد، '.', '-'
    • بدون فاصله یا کاراکتر خاص
  2. وابستگی:

    • اگر تگ وابستگی دارد، حذف ناموفق است
    • ابتدا تگ‌های وابسته را حذف کنید
  3. آخرین تگ:

    • اگر تنها تگ باشد، دایرکتوری کامل حذف می‌شود
    • بررسی دو بار قبل از حذف
  4. Prune:

    • layer‌های غیرمورد‌استفاده خودکار پاک می‌شود
    • اگر prune ناموفق، حذف نتمام می‌شود
  5. Performance:

    • حذف چند تگ را sequential انجام دهید
    • parallel حذف ممکن است race condition ایجاد کند
  6. Logging:

    • تمام حذف‌ها توسط سیستم log می‌شود
    • برای audit، log‌ها را ذخیره کنید
  7. Database:

    • رکورد ایمیج از DB حذف می‌شود
    • تاریخچه حذف در سیستم log باقی می‌ماند

دنباله عملیات

  1. اعتبارسنجی پارامترها
  2. دریافت لیست تگ‌های موجود
  3. بررسی وجود تگ
  4. بررسی تضادهای وابستگی
  5. حذف layer ایمیج
  6. پاک‌سازی layer‌های غیرمورد‌استفاده
  7. حذف رکورد از DB
  8. حذف دایرکتوری (اگر آخرین تگ)
  9. Logging موفقیت

مرجع سریع

وضعیتکدتوضیح
موفق200تگ حذف شد
پارامتر نامعتبر422InvalidRemoveImageParameters
تگ نیافت404ImageTagNotFound
تضاد وابستگی409ImageTagConflict
خطای ImageManager500ListImageTagsFailure
خطای حذف500RemoveImageLayerFailure
خطای DB500DeleteImageRecordFailure
خطای عمومی500GenericFailure

موارد استفاده

Cleanup Operations

const result = await removeAnImage('old-service', 'dev');
console.log(result);

Release Management

const result = await removeAnImage('app', '1.0');

Registry Maintenance

const images = await listImages({});
for (const img of images) {
if (shouldRemove(img)) {
await removeAnImage(img.Name, img.Tag);
}
}

CI/CD Pipeline

// Remove old build images
await removeAnImage('build-app', 'previous-version');

نسخه: 1.3
تاریخ آپدیت: 10 آذرماه ۱۴۰۴
تیم توسعه: K3 Development Team