حلّل مرجع Docker إلى سجل ومستودع ووسم أو بصمة
ألصق مرجع صورة Docker لتحصل على أجزائه المهمة في JSON منظم. يفصل المحلّل السجل الصريح، بما في ذلك المنفذ الاختياري، عن مسار المستودع وعن الوسم أو بصمة المحتوى الاختيارية.
شغّل الأداة مجانًا
وهو يميّز بين النقطتين في registry.example.com:5000 اللتين تخصان المنفذ، والنقطتين بعد اسم الصورة اللتين تبدآن الوسم. تؤدي المراجع غير الصحيحة إلى خطأ واضح بدل حقول جزئية مضللة. لا يتصل المحلّل بأي سجل، ولا يضيف بصمت قيمًا محذوفة مثل Docker Hub أو latest.
افصل كل جزء من دون افتراض قيم افتراضية خفية
قد يكون مرجع صورة Docker قصيرًا مثل alpine، وقد يكون مفصلًا مثل registry.example.com:5000/platform/api:2026.07. يستخدم كل من منفذ السجل ووسم الصورة النقطتين، ولذلك ينتج عن التقسيم المباشر وفق علامات الترقيم تحليل غير صحيح. يعزل هذا المحلّل البصمة أولًا، ثم يفحص الجزء الأخير من المسار وحده بحثًا عن وسم. ويعدّ أول مكوّن تفصله شرطة مائلة سجلًا صريحًا إذا كان localhost، أو احتوى على نقطة، أو تضمّن نقطتي منفذ، أو كان عنوان IPv6 موضوعًا بين قوسين مربعين. وتكوّن جميع المكوّنات التالية مسار المستودع. لا يحتفظ الناتج إلا بما ورد فعلًا في المدخل. فإذا كان المرجع alpine، كان المستودع alpine ولم يظهر حقل للسجل أو الوسم. لا يستبدل المحلّل السجل بـ docker.io، ولا يضيف نطاق library المعتاد، ولا يفترض latest. لذلك يناسب الناتج تحليل الإعدادات وفحوص السياسات وأدوات الترحيل التي يجب أن تميّز القيمة الصريحة عن القيمة الافتراضية التي يطبقها العميل.
تعامل بدقة مع الوسوم والبصمات والمنافذ والمسارات
تعرّف الوسوم والبصمات الصور بطريقتين مختلفتين. فالوسم تسمية قابلة للتغيير مثل stable أو 1.4.2 أو release_candidate، أما البصمة فهي معرّف مرتبط بالمحتوى يُكتب بعد علامة @ على هيئة خوارزمية وقيمة. يعيد المحلّل هاتين المعلومتين في حقلين منفصلين، ويقبل أيضًا مرجعًا يجمع بينهما؛ إذ تستطيع أدوات Docker تقييد اسم ذي وسم ببصمة محددة. يمكن أن تتكون مسارات المستودعات من عدة أجزاء مكتوبة بحروف صغيرة، مع الفواصل التي تسمح بها قواعد تسمية Docker المعروفة. تُفحص مضيفات السجل بصورة مستقلة، بما في ذلك المنافذ الرقمية من 1 إلى 65535 وصيغ IPv6 المكتوبة بحروف صغيرة بين قوسين مربعين. يجب أن تتبع خوارزمية البصمة وقيمتها المشفرة الصيغة الخاصة بكل منهما، وأن تكون القيمة طويلة بما يكفي لتكون ذات معنى. لا يحاول المحلّل حل وسم، أو إثبات وجود بصمة، أو التحقق من صلاحية بيانات الاعتماد لتنزيل الصورة. فهو تحليل نحوي فقط، ولهذا تبقى النتائج حتمية وخاصة ومتاحة دون اتصال بالشبكة.
ارفض المدخلات الملتبسة قبل إدخالها في الأتمتة
قد يكون المحلّل المتساهل خطرًا في أتمتة النشر، لأن خطأ كتابيًا بسيطًا قد يشير إلى صورة غير المقصودة. ترفض هذه القدرة القيم الفارغة، والمسافات في البداية أو النهاية أو الداخل، ومخططات URL، وفواصل البصمة المكررة، وأجزاء المسار الفارغة، والوسوم التالفة، ومنافذ السجل غير الصالحة، وأسماء المستودعات التي تحتوي على حروف كبيرة، وتعبيرات البصمة غير الصحيحة. كما تحد طول المرجع الكامل وقسم المستودع حتى يظل العمل محدودًا. يعيد التحقق خطأ واحدًا واضحًا للمدخل غير الصالح، بدل كائن جزئي قد يبدو موثوقًا. استخدم هذا السلوك عند مدخل مهمة CI، أو محرر بيان، أو مستورد جرد الصور، أو أداة مساعدة لسياسة القبول. يمكن توجيه النتيجة الصالحة وفق وجود السجل أو الوسم أو البصمة، بينما يوقف المدخل غير الصالح سير العمل مبكرًا. لا تعني صحة الصيغة أن المستودع أو الصورة موجودان؛ فإثبات ذلك يتطلب الوصول إلى السجل والمصادقة، وهما خارج نطاق هذه الأداة عمدًا. يجري التنفيذ محليًا في المتصفح، وتبلغ كلفة API مقدار $0.002 لكل مرجع.
حالات الاستخدام
تحقق من إعدادات النشر
ارفض مراجع الصور غير الصحيحة قبل أن يصل البيان إلى البناء أو النشر أو مرحلة التحكم في القبول.
أنشئ جردًا للصور
افصل السجلات ومسارات المستودعات والوسوم والبصمات الثابتة للتقارير أو الترحيل من دون الاتصال بأي سجل.
طبّق سياسة تسمية الصور
تحقق مما إذا كان المرجع يستخدم سجلًا معتمدًا أو بصمة إلزامية أو وسمًا قابلًا للتغيير لكنه محظور.
الأسئلة الشائعة
هل يضيف المحلّل docker.io أو library تلقائيًا؟
لا. فهو يعرض المكوّنات الصريحة فقط، لذلك يبقى السجل المحذوف غير موجود ويُحفظ المستودع كما كُتب.
هل تحصل الصورة التي بلا وسم على وسم latest؟
لا. يُحذف حقل الوسم عندما لا يحتوي المدخل على وسم. ولا تُعد قيم عميل Docker الافتراضية جزءًا من النص المحلّل.
هل يمكن أن يحتوي المرجع على وسم وبصمة معًا؟
نعم. عندما يظهر كلاهما بصيغة صحيحة، تتضمن النتيجة الحقلين من دون إسقاط أي من المحددين.
هل تُقبل الحروف الكبيرة في أسماء المستودعات؟
لا. يجب أن تُكتب مكوّنات مستودع Docker بحروف صغيرة. ويمكن أن تحتوي الوسوم على حروف كبيرة لأن صيغتها مختلفة.
هل يتحقق المحلّل من وجود الصورة؟
لا. فهو يتحقق من الصيغة ويفصلها فقط، ولا يجري بحثًا في السجل أو مصادقة أو تنزيلًا أو طلبًا شبكيًا.
ما كلفة استخدام API؟
السعر الأساسي هو $0.002 لكل مرجع. تعمل نسخة المتصفح محليًا من دون إرسال المرجع إلى أي سجل.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/dev2/docker-tag-parse \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"registry.example.com:5000/team/service:2026.07"}'const res = await fetch("https://api.kit.forhosting.com/dev2/docker-tag-parse", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "registry.example.com:5000/team/service:2026.07"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/docker-tag-parse",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "registry.example.com:5000/team/service:2026.07"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/docker-tag-parse", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"registry.example.com:5000/team/service:2026.07"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"registry.example.com:5000/team/service:2026.07"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/docker-tag-parse", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"text": "registry.example.com:5000/team/service:2026.07"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.docker_tag_parse",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |