بارگذاری ایمیج از فایل TAR
ایمیج را از فایل TAR بارگذاری کرده و در رجیستری محلی ثبت میکند.
🧩 دستور کلی
async loadImage(imageName, imagePath)
شرح عملکرد
این متد ایمیج را از فایل TAR بارگذاری میکند. شامل:
- اعتبارسنجی پارامترهای بارگذاری
- بررسی وجود فایل TAR
- بررسی عدم وجود ایمیج قبلی
- استخراج فایل TAR
- پیوند blobهای ایمیج
- خواندن manifest برای یافتن تگها
- پردازش هر تگ
- یافتن blobهای هر تگ
- ایجاد رکوردهای blob در DB
- محاسبه اندازه ایمیج
- دریافت تاریخچه ایمیج
- ایجاد رکورد ایمیج در DB برای هر تگ
- logging عملیات
مهم: فایل TAR باید با فرمت OCI یا Docker باشد. اگر ایمیج چند تگ داشته باشد، همه تگها بارگذاری میشود.
ورودیها
| پارامتر | نوع | اجباری | توضیح |
|---|---|---|---|
imageName | String | بله | نام ایمیج (مثلاً myapp, myrepo/myapp) |
imagePath | String | بله | مسیر کامل فایل 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
});
نکات عملی
-
فرمت فایل:
- باید TAR یا TAR.GZ باشد
- فرمت OCI یا Docker
- فایل معتبر و دستخوری نشده
-
مسیر فایل:
- مسیر مطلق استفاده کنید
- اجازههای خواندن موجود باشد
- فایل موجود باشد
-
فضای دیسک:
- فایل TAR + extracted size نیاز است
- حداقل 2x اندازه فایل TAR
-
چند تگ:
- اگر manifest چند تگ داشته باشد، همه بارگذاری میشود
- هر تگ الگو رکورد DB دارد
-
Blobs:
- تمام blobها linked میشود
- هر blob رکورد DB دارد
-
Performance:
- بزرگ فایلهای TAR زمانبر هستند
- compression باعث کاهش سرعت میشود
-
Database:
- هر تگ جداگانه ثبت میشود
- blob records ایجاد میشود
دنباله عملیات
- اعتبارسنجی پارامترها
- بررسی وجود فایل TAR
- بررسی عدم وجود ایمیج
- استخراج فایل TAR
- پیوند blobهای ایمیج
- خواندن manifest
- دریافت لیست تگها
- برای هر تگ:
- یافتن blobها
- ایجاد رکوردهای blob
- محاسبه اندازه
- دریافت تاریخچه
- ایجاد رکورد ایمیج
- Logging موفقیت
مرجع سریع
| وضعیت | کد | توضیح |
|---|---|---|
| موفق | 200 | Load موفق |
| پارامتر نامعتبر | 422 | InvalidLoadImageParameters |
| فایل یافت نشد | 404 | ImageTarfileNotFound |
| ایمیج موجود | 409 | ImageAlreadyExists |
| خطای TAR | 500 | ExtractImageTarfileFailure |
| خطای blob | 500 | LinkBlobsFailure |
| خطای manifest | 500 | ReadManifestFailure |
| خطای DB | 500 | CreateImageRecordFailure |
| خطای عمومی | 500 | GenericFailure |
موارد استفاده
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