وارد کردن ایمیج از فایل TAR
ایمیج را از فایل TAR وارد کرده و در رجیستری ثبت میکند.
🧩 دستور کلی
async importImage(imageId, tagName = "latest", filePath)
شرح عملکرد
این متد ایمیج را از فایل TAR وارد کرده و در رجیستری ثبت میکند. شامل:
- اعتبارسنجی پارامترهای واردکردن
- بررسی وجود فایل TAR
- بررسی عدم وجود ایمیج قبلی
- ایجاد نام موقت برای پردازش
- وارد کردن tarball به موقعیت موقت
- خواندن پیکربندی برای یافتن بیس ایمیج
- افزودن filesystem layer
- کپی به مسیر نهایی
- پیوند blobهای ایمیج
- تمیزکاری دایرکتوری موقت
- ثبت در دیتابیس
- logging عملیات
مهم: فایل TAR باید معتبر باشد. واردکردن خودکار تمام لایههای ایمیج را مدیریت میکند.
ورودیها
| پارامتر | نوع | اجباری | پیشفرض | توضیح |
|---|---|---|---|---|
imageId | String | بله | - | شناسه ایمیج (مثلاً myapp, myrepo/myapp) |
tagName | String | خیر | "latest" | تگ ایمیج (مثلاً v1.0, stable, alpine) |
filePath | String | بله | - | مسیر کامل فایل TAR (مثلاً /tmp/myapp.tar, /import/image.tar.gz) |
خروجی
نوع: String
پیام موفقیت:
myapp:latest has imported successfully
یا:
myrepo/myapp:v1.0 has imported successfully
استثناها (Errors)
InvalidImportImageParameters (422)
پیام: "Invalid import image parameters."
زمان رخ دادن: پارامترهای واردکردن نامعتبر باشند
جزئیات:
{
"type": "VALIDATION_ERROR",
"statusCode": 422,
"imageId": "invalid@image",
"tagName": "latest",
"filePath": "/tmp/image.tar",
"error": "Image ID contains invalid characters"
}
راهنمای حل:
- شناسه ایمیج: فقط حروف، اعداد، '-', '_', '/' مجاز
- تگ: فقط حروف، اعداد، '.', '-' مجاز
- مسیر فایل باید معتبر باشد
ImportTarfileNotFound (404)
پیام: "Import tarfile not found."
زمان رخ دادن: فایل TAR موجود نیست
جزئیات:
{
"type": "NOT_FOUND",
"statusCode": 404,
"filePath": "/tmp/nonexistent.tar",
"error": "File not found"
}
راهنمای حل:
- مسیر فایل را بررسی کنید
- فایل واقعاً موجود است؟
- مسیر مطلق استفاده کنید
FetchImageState (500)
پیام: "Failed to check image state in database."
زمان رخ دادن: خطا در بررسی وجود ایمیج در DB
جزئیات:
{
"type": "DB_ERROR",
"statusCode": 500,
"imageId": "myapp",
"tagName": "latest",
"error": "Database query failed"
}
راهنمای حل:
- اتصال دیتابیس را بررسی کنید
- دیتابیس را restart کنید
ImageAlreadyExists (409)
پیام: "Image already exists in local registry."
زمان رخ دادن: ایمیج با همین شناسه و تگ قبلاً موجود است
جزئیات:
{
"type": "INVALID_STATE_ERROR",
"statusCode": 409,
"imageId": "myapp",
"tagName": "latest",
"error": "Image already exists"
}
راهنمای حل:
- تگ متفاوتی استفاده کنید
- ایمیج قبلی را حذف کنید
- شناسه ایمیج را تغییر دهید
ImportTarballFailure (500)
پیام: "Failed to import tarball."
زمان رخ دادن: خطا در وارد کردن فایل TAR
جزئیات:
{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageId": "myapp",
"filePath": "/tmp/myapp.tar",
"error": "Tarball import failed"
}
راهنمای حل:
- فایل TAR معتبر است؟
- فرمت فایل صحیح است؟
- فضای دیسک کافی است؟
ReadImportedConfigFailure (500)
پیام: "Failed to read imported config."
زمان رخ دادن: خطا در خواندن پیکربندی ایمیج واردشده
جزئیات:
{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"tempName": "abc123def456",
"error": "Config file not found"
}
راهنمای حل:
- فایل TAR صحیح است؟
- config.json موجود است؟
AddFsLayerFailure (500)
پیام: "Failed to add filesystem layer."
زمان رخ دادن: خطا در افزودن filesystem layer
جزئیات:
{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageId": "myapp",
"tagName": "latest",
"error": "Layer addition failed"
}
راهنمای حل:
- ImageManager را بررسی کنید
- فضای دیسک کافی است؟
CopyImportedImageFailure (500)
پیام: "Failed to copy imported image."
زمان رخ دادن: خطا در کپی ایمیج واردشده
جزئیات:
{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"fromImage": "base:temp",
"toImage": "myapp:latest",
"error": "Image copy failed"
}
راهنمای حل:
- RegistryManager را بررسی کنید
- فضای دیسک کافی است؟
LinkBlobsFailure (500)
پیام: "Failed to link image blobs."
زمان رخ دادن: خطا در پیوند blobهای ایمیج
جزئیات:
{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageId": "myapp",
"error": "Blob linking failed"
}
راهنمای حل:
- دایرکتوری blobها موجود است؟
- فایلهای blob معتبر هستند؟
FindBlobsFailure (500)
پیام: "Failed to find image blobs."
زمان رخ دادن: خطا در یافتن blobهای ایمیج
جزئیات:
{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageId": "myapp",
"tagName": "latest",
"error": "Blob scanning failed"
}
راهنمای حل:
- دایرکتوری ایمیج موجود است؟
- فایلهای blob معتبر هستند؟
CreateImageBlobFailure (500)
پیام: "Failed to create blob record in database."
زمان رخ دادن: خطا در ایجاد رکورد blob در DB
جزئیات:
{
"type": "DB_ERROR",
"statusCode": 500,
"imageId": "myapp",
"tagName": "latest",
"error": "Database write failed"
}
راهنمای حل:
- اتصال دیتابیس را بررسی کنید
- دیتابیس را restart کنید
CalculateImageSizeFailure (500)
پیام: "Failed to calculate image size."
زمان رخ دادن: خطا در محاسبه اندازه ایمیج
جزئیات:
{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageId": "myapp",
"tagName": "latest",
"error": "Size calculation failed"
}
راهنمای حل:
- دایرکتوری ایمیج موجود است؟
- اجازههای خواندن موجود است؟
FetchImageHistoryFailure (500)
پیام: "Failed to fetch image history."
زمان رخ دادن: خطا در دریافت تاریخچه ایمیج
جزئیات:
{
"type": "IMAGE_SERVICE_ERROR",
"statusCode": 500,
"imageId": "myapp",
"tagName": "latest",
"error": "History fetch failed"
}
راهنمای حل:
- ImageManager را بررسی کنید
- metadata ایمیج موجود است؟
CreateImageRecordFailure (500)
پیام: "Failed to create image record in database."
زمان رخ دادن: خطا در ایجاد رکورد ایمیج در DB
جزئیات:
{
"type": "DB_ERROR",
"statusCode": 500,
"imageId": "myapp",
"tagName": "latest",
"error": "Database write failed"
}
راهنمای حل:
- اتصال دیتابیس را بررسی کنید
- دیتابیس را restart کنید
GenericFailure (500)
پیام: "Generic failure during image import."
زمان رخ دادن: خطای عمومی
جزئیات:
{
"type": "GENERIC_ERROR",
"statusCode": 500,
"error": "Image import failed"
}
راهنمای حل:
- سیستم لاگ را بررسی کنید
- تمام سرویسها را restart کنید
- دوباره تلاش کنید
مثالهای استفاده
مثال 1: وارد کردن ایمیج ساده
const K3Core = require('k3-core');
(async () => {
const k3 = new K3Core();
try {
const result = await k3.imageCore.importImage(
'myapp',
'latest',
'/tmp/myapp.tar'
);
console.log('Success:', result);
// Output: myapp:latest has imported successfully
} catch (error) {
console.log('ERROR:', error.createFullMessage());
}
})();
مثال 2: وارد کردن با تگ خاص
(async () => {
const k3 = new K3Core();
try {
const result = await k3.imageCore.importImage(
'nginx',
'v1.0',
'/home/user/nginx-v1.0.tar'
);
console.log('Import result:', result);
console.log('Image nginx:v1.0 imported successfully');
} catch (error) {
console.log('ERROR: Failed to import image');
console.log(error.message);
}
})();
مثال 3: وارد کردن و verify
(async () => {
const k3 = new K3Core();
try {
// Step 1: Import
console.log('Importing image...');
const importResult = await k3.imageCore.importImage(
'alpine',
'latest',
'/tmp/alpine-latest.tar'
);
console.log('Import result:', importResult);
// 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: وارد کردن چند ایمیج
(async () => {
const k3 = new K3Core();
const tarFiles = [
{ id: 'alpine', tag: 'latest', path: '/tmp/alpine.tar' },
{ id: 'nginx', tag: 'stable', path: '/tmp/nginx.tar' },
{ id: 'node', tag: '18', path: '/tmp/node.tar' }
];
const results = [];
for (const tar of tarFiles) {
try {
const result = await k3.imageCore.importImage(tar.id, tar.tag, tar.path);
results.push({
image: `${tar.id}:${tar.tag}`,
status: 'success',
message: result
});
console.log(`✓ ${tar.id}:${tar.tag} imported`);
} catch (error) {
results.push({
image: `${tar.id}:${tar.tag}`,
status: 'failed',
error: error.message
});
console.log(`✗ Failed to import ${tar.id}:${tar.tag}`);
}
}
console.log('\nImport Summary:');
console.table(results);
})();
مثال 5: وارد کردن با مدیریت خطاهای مختلف
(async () => {
const k3 = new K3Core();
const fs = require('fs');
const importWithErrorHandling = async (imageId, tagName, filePath) => {
try {
// Check file exists
if (!fs.existsSync(filePath)) {
return { success: false, error: 'File not found' };
}
// Check file size
const stats = fs.statSync(filePath);
console.log(`Importing ${imageId}:${tagName} (${(stats.size / 1024 / 1024).toFixed(2)} MB)...`);
const result = await k3.imageCore.importImage(imageId, tagName, filePath);
return { success: true, message: result };
} catch (error) {
if (error.statusCode === 404) {
console.log(`ERROR: File ${filePath} not found`);
return { success: false, error: 'File not found' };
} else if (error.statusCode === 409) {
console.log(`ERROR: Image ${imageId}:${tagName} 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: Import failed - ${error.message}`);
return { success: false, error: error.message };
}
}
};
const result = await importWithErrorHandling('myapp', 'v1.0', '/tmp/myapp.tar');
console.log('Result:', result);
})();
مثال 6: وارد کردن و استفاده فوری
(async () => {
const k3 = new K3Core();
try {
// Step 1: Import
console.log('Step 1: Importing image...');
const importResult = await k3.imageCore.importImage(
'myapp',
'v1.0',
'/tmp/myapp-latest.tar'
);
console.log('✓ Image imported:', importResult);
// Step 2: Verify
console.log('Step 2: Verifying image...');
const imageInfo = await k3.imageCore.inspectAnImage('myapp', {
imageName: 'myapp',
imageTag: 'v1.0'
});
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('Step 3: Creating container from imported image...');
const containerResult = await k3.containerCore.createContainer({
imageName: 'myapp',
imageTag: 'v1.0',
containerId: 'myapp-instance-001',
containerPort: 3000,
hostPort: 8080
});
console.log('✓ Container created');
console.log('\n✓ Successfully imported and deployed');
} catch (error) {
console.log('ERROR:', error.message);
}
})();
الگوهای خطا و راهنمای حل
الگو 1: فایل یافت نشد
خطا: ImportTarfileNotFound (404)
راهنمای حل:
const importWithFileCheck = async (imageId, tagName, filePath) => {
const fs = require('fs');
try {
// Check file exists
if (!fs.existsSync(filePath)) {
console.log(`File not found: ${filePath}`);
console.log('Available files in directory:');
const dir = filePath.substring(0, filePath.lastIndexOf('/'));
const files = fs.readdirSync(dir).filter(f => f.endsWith('.tar'));
files.forEach(f => console.log(` - ${f}`));
throw new Error(`File ${filePath} does not exist`);
}
console.log(`Importing from: ${filePath}`);
const result = await k3.imageCore.importImage(imageId, tagName, filePath);
return result;
} catch (error) {
console.log('ERROR:', error.message);
throw error;
}
};
await importWithFileCheck('myapp', 'latest', '/tmp/myapp.tar');
الگو 2: ایمیج قبلاً موجود است
خطا: ImageAlreadyExists (409)
راهنمای حل:
const importOrReplace = async (imageId, tagName, filePath, replace = false) => {
try {
const result = await k3.imageCore.importImage(imageId, tagName, filePath);
return { success: true, message: result };
} catch (error) {
if (error.statusCode === 409 && replace) {
console.log(`Image ${imageId}:${tagName} already exists. Removing...`);
try {
await k3.imageCore.removeAnImage(imageId, tagName);
console.log('Old image removed');
// Retry import
const retryResult = await k3.imageCore.importImage(imageId, tagName, filePath);
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 ${imageId}:${tagName} already exists`);
console.log('Use replace=true to overwrite');
return { success: false, error: 'Image already exists' };
}
throw error;
}
};
await importOrReplace('myapp', 'latest', '/tmp/myapp.tar', true);
الگو 3: فایل TAR نامعتبر
خطا: ImportTarballFailure (500)
راهنمای حل:
const importWithValidation = async (imageId, tagName, filePath) => {
const fs = require('fs');
try {
// Step 1: Validate file
console.log('Step 1: Validating tar file...');
const stats = fs.statSync(filePath);
console.log(` File size: ${(stats.size / 1024 / 1024).toFixed(2)} MB`);
console.log(` File type: ${filePath.endsWith('.gz') ? 'gzip' : 'uncompressed'}`);
// Step 2: Check if tar
if (!filePath.endsWith('.tar') && !filePath.endsWith('.tar.gz')) {
throw new Error('File must be .tar or .tar.gz format');
}
// Step 3: Try to import
console.log('Step 2: Importing image...');
const result = await k3.imageCore.importImage(imageId, tagName, filePath);
console.log('✓ Import successful');
return { success: true, message: result };
} catch (error) {
if (error.statusCode === 500) {
console.log('ERROR: Failed to import tar file');
console.log('Possible causes:');
console.log(' - File is corrupted');
console.log(' - Format is not valid');
console.log(' - Insufficient disk space');
}
return { success: false, error: error.message };
}
};
await importWithValidation('myapp', 'latest', '/tmp/myapp.tar');
الگو 5: وارد کردن و استفاده
راهنمای حل:
class ImageImportAndDeploy {
constructor(k3) {
this.k3 = k3;
}
async importAndDeploy(imageId, tagName, filePath, deploymentOptions = {}) {
try {
// Step 1: Import
console.log('Step 1: Importing image...');
const importResult = await this.k3.imageCore.importImage(imageId, tagName, filePath);
console.log(`✓ Image imported: ${imageId}:${tagName}`);
// Step 2: Verify
console.log('Step 2: Verifying image...');
const imageInfo = await this.k3.imageCore.inspectAnImage(imageId, {
imageName: imageId,
imageTag: tagName
});
console.log(`✓ Image verified - Size: ${(imageInfo.LayersData.reduce((s, l) => s + l.Size, 0) / 1024 / 1024).toFixed(2)} MB`);
// Step 3: Deploy
console.log('Step 3: Deploying containers...');
const replicas = deploymentOptions.replicas || 1;
for (let i = 0; i < replicas; i++) {
const contId = `${imageId}-replica-${i}`;
await this.k3.containerCore.createContainer({
imageName: imageId,
imageTag: tagName,
containerId: contId,
...deploymentOptions
});
console.log(`✓ Container created: ${contId}`);
}
console.log(`\n✓ Successfully deployed ${replicas} replicas`);
return { success: true, image: `${imageId}:${tagName}`, replicas: replicas };
} catch (error) {
console.log('ERROR:', error.message);
return { success: false, error: error.message };
}
}
}
const deployer = new ImageImportAndDeploy(k3);
await deployer.importAndDeploy('myapp', 'v1.0', '/tmp/myapp.tar', {
replicas: 2,
containerPort: 3000,
hostPort: 8080
});
نکات عملی
-
فرمت فایل:
- باید TAR یا TAR.GZ باشد
- فرمت OCI یا Docker
- فایل معتبر و دستخوری نشده
-
مسیر فایل:
- مسیر مطلق استفاده کنید
- اجازههای خواندن موجود باشد
- فایل موجود باشد
-
فضای دیسک:
- فایل TAR + extracted size نیاز است
- حداقل 2x اندازه فایل TAR
-
پیکربندی:
- config.json باید موجود باشد
- بیس ایمیج باید معتبر باشد
-
Performance:
- واردکردن فایلهای بزرگ زمانبر است
- compression باعث کاهش سرعت میشود
-
تمیزکاری:
- دایرکتوری موقت خودکار تمیز میشود
- اگر خطا رخ دهد cleanup انجام میشود
دنباله عملیات
- اعتبارسنجی پارامترها
- بررسی وجود فایل TAR
- بررسی عدم وجود ایمیج
- ایجاد نام موقت
- وارد کردن tarball
- خواندن پیکربندی
- افزودن filesystem layer
- کپی به مسیر نهایی
- پیوند blobها
- تمیزکاری موقت
- ثبت در دیتابیس
- Logging موفقیت
مرجع سریع
| وضعیت | کد | توضیح |
|---|---|---|
| موفق | 200 | واردکردن موفق |
| پارامتر نامعتبر | 422 | InvalidImportImageParameters |
| فایل یافت نشد | 404 | ImportTarfileNotFound |
| DB خطا | 500 | FetchImageState |
| ایمیج موجود | 409 | ImageAlreadyExists |
| tarball خطا | 500 | ImportTarballFailure |
| config خطا | 500 | ReadImportedConfigFailure |
| layer خطا | 500 | AddFsLayerFailure |
| copy خطا | 500 | CopyImportedImageFailure |
| blobs خطا | 500 | LinkBlobsFailure/FindBlobsFailure |
| اندازه خطا | 500 | CalculateImageSizeFailure |
| history خطا | 500 | FetchImageHistoryFailure |
| DB record خطا | 500 | CreateImageRecordFailure |
| خطای عمومی | 500 | GenericFailure |
موارد استفاده
Image Restoration
const result = await importImage('myapp', 'latest', '/backups/myapp.tar');
Offline Migration
const result = await importImage('app', 'v1.0', '/migration/app.tar');
Development Setup
const result = await importImage('dev-env', 'latest', '/dev/environment.tar');
Batch Import
const files = ['/imports/image1.tar', '/imports/image2.tar'];
for (const file of files) {
await importImage('app', 'latest', file);
}
نسخه: 1.3
تاریخ آپدیت: 10 آذرماه ۱۴۰۴
تیم توسعه: K3 Development Team