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

بارگذاری ایمیج از فایل TAR

ایمیج را از فایل TAR بارگذاری کرده و در رجیستری محلی ثبت می‌کند.


🧩 دستور کلی

async loadImage(imageName, imagePath)

شرح عملکرد

این متد ایمیج را از فایل TAR بارگذاری می‌کند. شامل:

  • اعتبارسنجی پارامترهای بارگذاری
  • بررسی وجود فایل TAR
  • بررسی عدم وجود ایمیج قبلی
  • استخراج فایل TAR
  • پیوند blob‌های ایمیج
  • خواندن manifest برای یافتن تگ‌ها
  • پردازش هر تگ
  • یافتن blob‌های هر تگ
  • ایجاد رکوردهای blob در DB
  • محاسبه اندازه ایمیج
  • دریافت تاریخچه ایمیج
  • ایجاد رکورد ایمیج در DB برای هر تگ
  • logging عملیات

مهم: فایل TAR باید با فرمت OCI یا Docker باشد. اگر ایمیج چند تگ داشته باشد، همه تگ‌ها بارگذاری می‌شود.


ورودی‌ها

پارامترنوعاجباریتوضیح
imageNameStringبلهنام ایمیج (مثلاً myapp, myrepo/myapp)
imagePathStringبلهمسیر کامل فایل TAR (مثلاً /tmp/myapp.tar, /home/user/image.tar.gz)

خروجی

نوع: String

پیام موفقیت:

/tmp/myapp.tar has loaded successfully

یا:

/home/user/image.tar.gz has loaded successfully

استثناها (Errors)

InvalidLoadImageParameters (422)

پیام: "Invalid load image parameters."

زمان رخ دادن: پارامترهای بارگذاری نامعتبر باشند

جزئیات:

{
"type": "VALIDATION_ERROR",
"statusCode": 422,
"imageName": "invalid@image",
"imagePath": "/tmp/myapp.tar",
"error": "Image name contains invalid characters"
}

راهنمای حل:

  • نام ایمیج: فقط حروف، اعداد، '-', '_', '/' مجاز
  • مسیر فایل باید معتبر باشد
  • فرمت: نام و مسیر کامل

ImageTarfileNotFound (404)

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

زمان رخ دادن: فایل TAR موجود نیست

جزئیات:

{
"type": "NOT_FOUND",
"statusCode": 404,
"imagePath": "/tmp/nonexistent.tar",
"error": "File not found"
}

راهنمای حل:

  • مسیر فایل را بررسی کنید
  • فایل واقعاً موجود است؟
  • مسیر مطلق استفاده کنید
  • اجازه‌های خواندن موجود است؟

FetchImageTagsFailure (500)

پیام: "Failed to fetch image tags from database."

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

جزئیات:

{
"type": "DB_ERROR",
"statusCode": 500,
"imageName": "myapp",
"error": "Database query failed"
}

راهنمای حل:

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

ImageAlreadyExists (409)

پیام: "Image already exists in local registry."

زمان رخ دادن: ایمیج با همین نام قبلاً موجود است

جزئیات:

{
"type": "INVALID_STATE_ERROR",
"statusCode": 409,
"imageName": "myapp",
"error": "Image already exists"
}

راهنمای حل:

  • نام ایمیج متفاوتی استفاده کنید
  • ایمیج قبلی را حذف کنید
  • نام ایمیج را تغییر دهید

ExtractImageTarfileFailure (500)

پیام: "Failed to extract image tarfile."

زمان رخ دادن: خطا در استخراج فایل TAR

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "myapp",
"imagePath": "/tmp/myapp.tar",
"error": "Tar extraction failed"
}

راهنمای حل:

  • فایل TAR معتبر است؟
  • فرمت فایل OCI یا Docker است؟
  • فضای دیسک کافی است؟
  • اجازه‌های نوشتن موجود است؟

LinkBlobsFailure (500)

پیام: "Failed to link image blobs."

زمان رخ دادن: خطا در پیوند blob‌های ایمیج

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "myapp",
"error": "Blob linking failed"
}

راهنمای حل:

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

ReadManifestFailure (500)

پیام: "Failed to read image manifest."

زمان رخ دادن: خطا در خواندن manifest.json

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "myapp",
"error": "Manifest file not found or invalid JSON"
}

راهنمای حل:

  • فایل manifest.json موجود است؟
  • JSON معتبر است؟
  • مسیر دایرکتوری ایمیج درست است؟

FindBlobsFailure (500)

پیام: "Failed to find image blobs."

زمان رخ دادن: خطا در یافتن blob‌های ایمیج

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "myapp",
"imageTag": "latest",
"error": "Blob scanning failed"
}

راهنمای حل:

  • دایرکتوری blob‌ها موجود است؟
  • فایل‌های blob معتبر هستند؟

CreateImageBlobFailure (500)

پیام: "Failed to create blob record in database."

زمان رخ دادن: خطا در ایجاد رکورد blob در DB

جزئیات:

{
"type": "DB_ERROR",
"statusCode": 500,
"imageName": "myapp",
"imageTag": "latest",
"blobCount": 5,
"error": "Database write failed"
}

راهنمای حل:

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

CalculateImageSizeFailure (500)

پیام: "Failed to calculate image size."

زمان رخ دادن: خطا در محاسبه اندازه ایمیج

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "myapp",
"imageTag": "latest",
"error": "Size calculation failed"
}

راهنمای حل:

  • دایرکتوری ایمیج موجود است؟
  • اجازه‌های خواندن موجود است؟

FetchImageHistoryFailure (500)

پیام: "Failed to fetch image history."

زمان رخ دادن: خطا در دریافت تاریخچه ایمیج

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "myapp",
"imageTag": "latest",
"error": "History fetch failed"
}

راهنمای حل:

  • ImageManager را بررسی کنید
  • metadata ایمیج موجود است؟

CreateImageRecordFailure (500)

پیام: "Failed to create image record in database."

زمان رخ دادن: خطا در ایجاد رکورد ایمیج در DB

جزئیات:

{
"type": "DB_ERROR",
"statusCode": 500,
"imageName": "myapp",
"imageTag": "latest",
"error": "Database write failed"
}

راهنمای حل:

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

ProcessImageTagFailure (500)

پیام: "Failed to process image tag."

زمان رخ دادن: خطا در پردازش یک تگ خاص

جزئیات:

{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageName": "myapp",
"imageTag": "v1.0",
"error": "Tag processing failed"
}

راهنمای حل:

  • تگ معتبر است؟
  • لاگ‌های سیستم را بررسی کنید

GenericFailure (500)

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

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

جزئیات:

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

راهنمای حل:

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

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

مثال 1: Load ایمیج ساده

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

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

try {
const result = await k3.imageCore.loadImage(
'myapp',
'/tmp/myapp.tar'
);
console.log('Success:', result);
// Output: /tmp/myapp.tar has loaded successfully
} catch (error) {
console.log('ERROR:', error.createFullMessage());
}
})();

مثال 2: Load ایمیج فشرده

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

try {
const result = await k3.imageCore.loadImage(
'nginx',
'/home/user/nginx.tar.gz'
);
console.log('Load result:', result);
console.log('Image nginx loaded from compressed tar');
} catch (error) {
console.log('ERROR: Failed to load image');
console.log(error.message);
}
})();

مثال 3: Load و verify

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

try {
// Step 1: Load
console.log('Loading image...');
const loadResult = await k3.imageCore.loadImage(
'alpine',
'/tmp/alpine-latest.tar'
);
console.log('Load result:', loadResult);

// Step 2: Verify
console.log('Verifying image...');
const imageList = await k3.imageCore.listImages({ image: 'alpine' });

console.log('Image verified:');
console.log(` Total tags: ${imageList.length}`);
imageList.forEach(img => {
console.log(` - ${img.Name}:${img.Tag}`);
});
} catch (error) {
console.log('ERROR:', error.message);
}
})();

مثال 4: Load چند ایمیج

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

const tarFiles = [
{ name: 'alpine', path: '/tmp/alpine.tar' },
{ name: 'nginx', path: '/tmp/nginx.tar' },
{ name: 'node', path: '/tmp/node.tar' }
];

const results = [];

for (const tar of tarFiles) {
try {
const result = await k3.imageCore.loadImage(tar.name, tar.path);
results.push({
image: tar.name,
status: 'success',
message: result
});
console.log(`${tar.name} loaded`);
} catch (error) {
results.push({
image: tar.name,
status: 'failed',
error: error.message
});
console.log(`✗ Failed to load ${tar.name}`);
}
}

console.log('\nLoad Summary:');
console.table(results);
})();

مثال 5: Load با مدیریت خطاهای مختلف

(async () => {
const k3 = new K3Core();
const fs = require('fs');
const path = require('path');

const loadWithErrorHandling = async (imageName, imagePath) => {
try {
// Check file exists
if (!fs.existsSync(imagePath)) {
return { success: false, error: 'File not found' };
}

// Check file size
const stats = fs.statSync(imagePath);
console.log(`Loading ${imageName} (${(stats.size / 1024 / 1024).toFixed(2)} MB)...`);

const result = await k3.imageCore.loadImage(imageName, imagePath);
return { success: true, message: result };
} catch (error) {
if (error.statusCode === 404) {
console.log(`ERROR: File ${imagePath} not found`);
return { success: false, error: 'File not found' };
} else if (error.statusCode === 409) {
console.log(`ERROR: Image ${imageName} already exists`);
return { success: false, error: 'Image already exists' };
} else if (error.statusCode === 422) {
console.log('ERROR: Invalid parameters');
return { success: false, error: 'Invalid parameters' };
} else {
console.log(`ERROR: Load failed - ${error.message}`);
return { success: false, error: error.message };
}
}
};

const result = await loadWithErrorHandling('myapp', '/tmp/myapp.tar');
console.log('Result:', result);
})();

مثال 6: Load و extract metadata

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

try {
// Load
console.log('Loading image...');
const loadResult = await k3.imageCore.loadImage(
'postgres',
'/tmp/postgres-latest.tar'
);
console.log('Load result:', loadResult);

// Extract metadata
console.log('\nExtracting metadata...');
const images = await k3.imageCore.listImages({ image: 'postgres' });

console.log(`\n=== Loaded Image Metadata ===`);
images.forEach(img => {
console.log(`\nImage: ${img.Name}`);
console.log(` Tag: ${img.Tag}`);
console.log(` Size: ${(img.Size / 1024 / 1024).toFixed(2)} MB`);
console.log(` Created: ${img.CreatedAt}`);
});
} catch (error) {
console.log('ERROR:', error.message);
}
})();

مثال 7: Batch load از دایرکتوری

(async () => {
const k3 = new K3Core();
const fs = require('fs');
const path = require('path');

const loadImagesFromDirectory = async (dirPath) => {
try {
const files = fs.readdirSync(dirPath);
const tarFiles = files.filter(f => f.endsWith('.tar') || f.endsWith('.tar.gz'));

console.log(`Found ${tarFiles.length} tar files in ${dirPath}`);

const results = [];

for (const file of tarFiles) {
const imageName = path.parse(file).name.split('.')[0];
const fullPath = path.join(dirPath, file);

try {
console.log(`Loading ${imageName}...`);
const result = await k3.imageCore.loadImage(imageName, fullPath);
results.push({ image: imageName, status: 'success' });
console.log(`${imageName} loaded`);
} catch (error) {
results.push({ image: imageName, status: 'failed', error: error.message });
console.log(`✗ Failed to load ${imageName}`);
}
}

console.log('\nBatch Load Summary:');
console.table(results);
return results;
} catch (error) {
console.log('ERROR:', error.message);
}
};

await loadImagesFromDirectory('/tmp/images');
})();

مثال 8: Load و push به registry

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

try {
// Step 1: Load
console.log('Step 1: Loading image...');
const loadResult = await k3.imageCore.loadImage(
'myapp',
'/tmp/myapp-latest.tar'
);
console.log('✓ Image loaded:', loadResult);

// Step 2: Verify
console.log('\nStep 2: Verifying image...');
const imageInfo = await k3.imageCore.inspectAnImage('myapp', {
imageName: 'myapp',
imageTag: 'latest'
});
console.log('✓ Image verified');
console.log(` Size: ${(imageInfo.LayersData.reduce((s, l) => s + l.Size, 0) / 1024 / 1024).toFixed(2)} MB`);

// Step 3: Create container (optional)
console.log('\nStep 3: Creating container from loaded image...');
const containerResult = await k3.containerCore.createContainer({
imageName: 'myapp',
imageTag: 'latest',
containerId: 'myapp-instance-001',
containerPort: 3000,
hostPort: 8080
});
console.log('✓ Container created');

console.log('\n✓ Successfully completed all steps');
} catch (error) {
console.log('ERROR:', error.message);
}
})();

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

الگو 1: فایل TAR یافت نشد

خطا: ImageTarfileNotFound (404)

راهنمای حل:

const loadWithFileCheck = async (imageName, imagePath) => {
const fs = require('fs');

try {
// Check file exists
if (!fs.existsSync(imagePath)) {
console.log(`File not found: ${imagePath}`);
console.log('Available files in directory:');
const dir = fs.readdirSync('/tmp').filter(f => f.endsWith('.tar') || f.endsWith('.tar.gz'));
dir.forEach(f => console.log(` - ${f}`));
throw new Error(`File ${imagePath} does not exist`);
}

// Check file is readable
fs.accessSync(imagePath, fs.constants.R_OK);

console.log(`Loading from: ${imagePath}`);
const result = await k3.imageCore.loadImage(imageName, imagePath);
return result;
} catch (error) {
console.log('ERROR:', error.message);
throw error;
}
};

await loadWithFileCheck('myapp', '/tmp/myapp.tar');

الگو 2: ایمیج قبلاً موجود است

خطا: ImageAlreadyExists (409)

راهنمای حل:

const loadOrReplace = async (imageName, imagePath, replace = false) => {
try {
const result = await k3.imageCore.loadImage(imageName, imagePath);
return { success: true, message: result };
} catch (error) {
if (error.statusCode === 409 && replace) {
console.log(`Image ${imageName} already exists. Removing...`);

try {
// Get all tags
const tags = await k3.imageCore.listImages({ image: imageName });

// Remove all tags
for (const img of tags) {
await k3.imageCore.removeAnImage(imageName, img.Tag);
console.log(`Removed ${imageName}:${img.Tag}`);
}

// Retry load
console.log('Loading image again...');
const retryResult = await k3.imageCore.loadImage(imageName, imagePath);
return { success: true, message: retryResult, replaced: true };
} catch (removeError) {
return { success: false, error: `Failed to remove old image: ${removeError.message}` };
}
} else if (error.statusCode === 409) {
console.log(`Image ${imageName} already exists`);
console.log('Use replace=true to overwrite');
return { success: false, error: 'Image already exists' };
}
throw error;
}
};

await loadOrReplace('myapp', '/tmp/myapp.tar', true);

الگو 3: فایل TAR نامعتبر

خطا: ExtractImageTarfileFailure (500)

راهنمای حل:

const loadWithValidation = async (imageName, imagePath) => {
const fs = require('fs');

try {
// Step 1: Validate file
console.log('Step 1: Validating tar file...');
const stats = fs.statSync(imagePath);
console.log(` File size: ${(stats.size / 1024 / 1024).toFixed(2)} MB`);
console.log(` File type: ${imagePath.endsWith('.gz') ? 'gzip' : 'uncompressed'}`);

// Step 2: Check if tar
if (!imagePath.endsWith('.tar') && !imagePath.endsWith('.tar.gz')) {
throw new Error('File must be .tar or .tar.gz format');
}

// Step 3: Try to load
console.log('Step 2: Loading image...');
const result = await k3.imageCore.loadImage(imageName, imagePath);

console.log('✓ Load successful');
return { success: true, message: result };
} catch (error) {
if (error.statusCode === 500) {
console.log('ERROR: Failed to extract tar file');
console.log('Possible causes:');
console.log(' - File is corrupted');
console.log(' - Format is not OCI or Docker');
console.log(' - Insufficient disk space');
}
return { success: false, error: error.message };
}
};

await loadWithValidation('myapp', '/tmp/myapp.tar');

الگو 4: Load با تتبع تغییرات

راهنمای حل:

class ImageLoadTracker {
constructor(k3) {
this.k3 = k3;
this.loads = [];
}

async load(imageName, imagePath) {
const startTime = Date.now();
const fs = require('fs');
const fileSize = fs.statSync(imagePath).size;

try {
console.log(`Starting load: ${imageName} from ${imagePath}`);

const result = await this.k3.imageCore.loadImage(imageName, imagePath);

const duration = Date.now() - startTime;
const speed = (fileSize / 1024 / 1024 / (duration / 1000)).toFixed(2);

this.loads.push({
image: imageName,
path: imagePath,
fileSize: (fileSize / 1024 / 1024).toFixed(2) + ' MB',
duration: (duration / 1000).toFixed(2) + 's',
speed: speed + ' MB/s',
status: 'success',
timestamp: new Date()
});

console.log(`✓ Load completed in ${(duration / 1000).toFixed(2)}s (${speed} MB/s)`);
return result;
} catch (error) {
const duration = Date.now() - startTime;

this.loads.push({
image: imageName,
path: imagePath,
fileSize: (fileSize / 1024 / 1024).toFixed(2) + ' MB',
duration: (duration / 1000).toFixed(2) + 's',
status: 'failed',
error: error.message,
timestamp: new Date()
});

console.log(`✗ Load failed after ${(duration / 1000).toFixed(2)}s`);
throw error;
}
}

getHistory() {
return this.loads;
}

printSummary() {
console.log('\n=== Load History ===');
console.table(this.loads);
}
}

const tracker = new ImageLoadTracker(k3);
await tracker.load('alpine', '/tmp/alpine.tar');
await tracker.load('nginx', '/tmp/nginx.tar');
tracker.printSummary();

الگو 5: Load و استفاده فوری

راهنمای حل:

class ImageLoadAndDeploy {
constructor(k3) {
this.k3 = k3;
}

async loadAndDeploy(imageName, imagePath, deploymentOptions = {}) {
try {
// Step 1: Load
console.log('Step 1: Loading image...');
const loadResult = await this.k3.imageCore.loadImage(imageName, imagePath);
console.log(`✓ Image loaded: ${imageName}`);

// Step 2: Get tags
console.log('Step 2: Extracting image tags...');
const images = await this.k3.imageCore.listImages({ image: imageName });
const tags = images.map(img => img.Tag);
console.log(`✓ Found ${tags.length} tags: ${tags.join(', ')}`);

// Step 3: Verify
console.log('Step 3: Verifying image...');
const imageInfo = await this.k3.imageCore.inspectAnImage(imageName, {
imageName: imageName,
imageTag: tags[0]
});
console.log(`✓ Image verified - Size: ${(imageInfo.LayersData.reduce((s, l) => s + l.Size, 0) / 1024 / 1024).toFixed(2)} MB`);

// Step 4: Deploy
console.log('Step 4: Deploying containers...');
const replicas = deploymentOptions.replicas || 1;

for (let i = 0; i < replicas; i++) {
const contId = `${imageName}-instance-${i}`;

await this.k3.containerCore.createContainer({
imageName: imageName,
imageTag: tags[0],
containerId: contId,
...deploymentOptions
});

console.log(`✓ Container created: ${contId}`);
}

console.log(`\n✓ Successfully deployed ${replicas} replicas`);
return { success: true, image: `${imageName}:${tags[0]}`, replicas: replicas };
} catch (error) {
console.log('ERROR:', error.message);
return { success: false, error: error.message };
}
}
}

const deployer = new ImageLoadAndDeploy(k3);
await deployer.loadAndDeploy('myapp', '/tmp/myapp-latest.tar', {
replicas: 2,
containerPort: 3000,
hostPort: 8080
});

نکات عملی

  1. فرمت فایل:

    • باید TAR یا TAR.GZ باشد
    • فرمت OCI یا Docker
    • فایل معتبر و دستخوری نشده
  2. مسیر فایل:

    • مسیر مطلق استفاده کنید
    • اجازه‌های خواندن موجود باشد
    • فایل موجود باشد
  3. فضای دیسک:

    • فایل TAR + extracted size نیاز است
    • حداقل 2x اندازه فایل TAR
  4. چند تگ:

    • اگر manifest چند تگ داشته باشد، همه بارگذاری می‌شود
    • هر تگ الگو رکورد DB دارد
  5. Blobs:

    • تمام blob‌ها linked می‌شود
    • هر blob رکورد DB دارد
  6. Performance:

    • بزرگ فایل‌های TAR زمان‌بر هستند
    • compression باعث کاهش سرعت می‌شود
  7. Database:

    • هر تگ جداگانه ثبت می‌شود
    • blob records ایجاد می‌شود

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

  1. اعتبارسنجی پارامترها
  2. بررسی وجود فایل TAR
  3. بررسی عدم وجود ایمیج
  4. استخراج فایل TAR
  5. پیوند blob‌های ایمیج
  6. خواندن manifest
  7. دریافت لیست تگ‌ها
  8. برای هر تگ:
  • یافتن blob‌ها
  • ایجاد رکوردهای blob
  • محاسبه اندازه
  • دریافت تاریخچه
  • ایجاد رکورد ایمیج
  1. Logging موفقیت

مرجع سریع

وضعیتکدتوضیح
موفق200Load موفق
پارامتر نامعتبر422InvalidLoadImageParameters
فایل یافت نشد404ImageTarfileNotFound
ایمیج موجود409ImageAlreadyExists
خطای TAR500ExtractImageTarfileFailure
خطای blob500LinkBlobsFailure
خطای manifest500ReadManifestFailure
خطای DB500CreateImageRecordFailure
خطای عمومی500GenericFailure

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

Backup Restoration

const result = await loadImage('backup-image', '/backup/image-backup.tar');

Offline Image Transfer

const result = await loadImage('transferred-image', '/tmp/transferred.tar');

Local Development

const result = await loadImage('dev-app', '/home/dev/dev-image.tar');

Batch Import

const tarFiles = ['/tmp/image1.tar', '/tmp/image2.tar'];
for (const tar of tarFiles) {
await loadImage('app', tar);
}

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