4.1 · السجلات : Hub و GHCR والسجل الخاص

المستوى 4 · السجلات (registres)، والموثوقية (fiabilité) و CI

4.1السجلات : Hub و GHCR والسجل الخاص

الهدف: نشر الصور وسحبها من السجل الصحيح، العام أو الخاص.
الوقت المقدّر: 12 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • ثلاثة سجلات (registres)، وثلاثة استعمالات : Docker Hub للمشاركة العامة، وGHCR المرتبط بالكود لأجل CI، والسجل الخاص (registre privé) (داخل الشركة) للحساس — والاسم الكامل (السجل/الحساب/الصورة:الوسم) يقول دائما من أين تأتي الصورة.
  • نستوثق برمز (token) محدود الصلاحيات، وليس بكلمة مرور الحساب أبدا : يمر عبر --password-stdin، فلا يبقى في سجل الصدفة (historique shell) ولا في سجلات CI — ويُبطل بنقرة واحدة عند الشك.
  • منعكس إدير : في الإنتاج، نسحب اسما كاملا + وسما ثابتا (وليس اختصارا غامضا أبدا)، مسجلا في compose الإنتاج لنعرف أي صورة تدور أين.

حالة مصغرة متواصلة — إدير ينشر صورة شركته الناشئة دون تسريب الرمز

إدير، مهندس devops مبتدئ في الجزائر، عليه نشر صورة تطبيق شركته الناشئة لينشرها الفريق : يختار GHCR (فالكود موجود أصلا على GitHub)، وينشئ رمزا (token) محدودا بالدفع والسحب، ويتصل عبر --password-stdin ويدفع وسما ثابتا للإصدار. وفي الإنتاج، يسحب الفريق الاسم الكامل ويعرف بالضبط أي صورة تدور. أول محطة في الخيط الرابط : الصورة في المكان الصحيح، متاحة للأشخاص الصحيحين، دون سر مكشوف.

الحالة نفسها تعود في الدرس والمخطط والنص الجاهز وتحدي 48 ساعة — وتستمر في 4.2 و4.3 و4.4 و4.5.

1. ثلاثة سجلات، وثلاثة استعمالات

Docker Hub : المكتبة العامة الافتراضية، للمشاركة (المصدر المفتوح، والصور القاعدية). GHCR (سجل حاويات GitHub) : السجل المرتبط بكودك، المثالي لـ CI — فلكل مستودع حزمه. السجل الخاص (registre privé) (داخل الشركة) : خزنة الصور الحساسة، بوصول مقيد. والاسم الكامل يدل عليه : السجل/الحساب/الصورة:الوسم — فيقرأ إدير بنظرة واحدة من أين تأتي كل صورة.

الاختيار حسم حسب الحساسية والاستعمال : العام للمصدر المفتوح، وGHCR لأجل CI على GitHub، والخاص للداخلي الحساس. ويثبت compose الإنتاج الاختيار بتسجيل الأسماء الكاملة.

2. الاستيثاق دون كشف

docker login مع رمز (token) محدود الصلاحيات (دفع/سحب)، وليس كلمة مرور الحساب أبدا. ويمر الرمز عبر --password-stdin (أنبوب، وليس وسيطا مرئيا) : لا شيء في سجل الصدفة، ولا شيء في السجلات. وفي CI، يعيش الرمز في أسرار المستودع، وليس في السكريبت ولا في ملف سير العمل أبدا.

الرمز المتسرب يُبطل بنقرة واحدة : ولهذا لا نتشارك حسابا أبدا — فالحساب المشترك المخترق يعني إعادة كل الوصول. ومثل إدير، ننشئ رمزا لكل استعمال ونبطل عند أدنى شك.

3. السحب في الإنتاج : ثبت المصدر

في الإنتاج، نسحب الاسم الكامل + وسما ثابتا (إصدارا مثبتا)، وليس اختصارا غامضا قد يتغير محتواه بين نشرين. وتبدأ قابلية التتبع « أي صورة تدور أين » بأسماء كاملة مسجلة في compose الإنتاج.

تحقق بعد السحب : الصورة المشغلة تطابق الوسم المطلوب فعلا. فالوسم المتحرك في الإنتاج نشر لا يمكن إعادته ولا تدقيقه.

خطأ شائع في الفهم: « للسرعة، أضع كلمة مروري بالنص الصريح مع -p وأدفع بـ latest : فهو نفسه ». لا. فكلمة المرور بالنص الصريح تبقى في السجل والسجلات، وتمنح وصولا كاملا لا يُبطل بنظافة ؛ والوسم المتحرك في الإنتاج يجعل النشر غير قابل لإعادة الإنتاج. رمز محدود عبر --password-stdin، مخزن في سر CI، ووسم ثابت في الإنتاج : هذا الثلاثي هو ما يصنع نشرا نظيفا.
النشر دون كشف السجل الصحيح، ورمز نظيف، ووسم مثبت اختيار السجل Hub عام، وGHCRلأجل CI، وخاص داخليرمز محدود صلاحياتدفع/سحب، قابل للإبطالاتصال نظيف --password-stdin،وسر CIوسم ثابت اسم كاملمثبت في الإنتاج
السجل الصحيح، ورمز نظيف، ووسم مثبت
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) يختار إدير السجل حسب الاستعمال : GHCR للصورة المرتبطة بكود شركته الناشئة. 2) ينشئ رمزا (token) محدود الصلاحيات (دفع/سحب) بدلا من استعمال كلمة مرور الحساب. 3) يتصل عبر --password-stdin ليبقى السر خارج السجل والسجلات. 4) يدفع وسما ثابتا للإصدار ويسحب الإنتاج الاسم الكامل. الدرس : السجل الصحيح، ورمز محدود عبر stdin، ووسم مثبت — والإبطال عند أدنى شك.

🔎 مثال ملموس — 🔎 مثال ملموس — الدفع نحو GHCR

إيماءة إدير : اتصال دون أثر، وصورة قابلة للتتبع.

echo $GHCR_TOKEN | docker login ghcr.io -u moncompte --password-stdin
docker build -t ghcr.io/monequipe/app:1.2.0 .
docker push ghcr.io/monequipe/app:1.2.0
# في الإنتاج :
docker pull ghcr.io/monequipe/app:1.2.0

القراءة : الرمز لا يظهر أبدا، والصورة قابلة للتتبع باسمها الكامل.

الدرس : --password-stdin يتفادى السر في السجل.

مفردات القسم

GHCR
سجل GitHub، المرتبط بالمستودعات وبـ CI : ينشر فيه كل مشروع صوره.

مثال بسيط: يدفع إدير فيه صورة التطبيق الذي كوده موجود أصلا على GitHub.

ما ليس كذلك: مجرد مجلد تخزين ملفات.

رد فعل: كود على GitHub + صورة للنشر في CI : فكر في GHCR.

الرمز (Token)
تذكرة وصول محدودة الصلاحيات وقابلة للإبطال، تعوض كلمة المرور للاستعمالات المؤتمتة.

مثال بسيط: ينشئ إدير رمز دفع/سحب بدلا من لصق كلمة مروره في سكريبت.

ما ليس كذلك: كلمة مرور الحساب، الكاملة والتي يصعب إبطالها بنظافة.

رد فعل: لأتمتة وصول : أنشئ رمزا محدودا، وليست كلمة المرور أبدا.

الاسم الكامل
عنوان صورة دون غموض : السجل/الحساب/الصورة:الوسم.

مثال بسيط: ينشر فريق إدير اسما كاملا بإصدار مثبت في الإنتاج.

ما ليس كذلك: اختصار غامض قد يتغير محتواه.

رد فعل: في الإنتاج : اسحب دائما اسما كاملا + وسما ثابتا.

--password-stdin
خيار docker login الذي يقرأ السر من أنبوب بدلا من وسيط مرئي.

مثال بسيط: يمرر إدير رمزه بالأنبوب : لا يبقى شيء في سجل الصدفة.

ما ليس كذلك: الخيار -p الذي يكشف السر بالنص الصريح.

رد فعل: للاتصال بسجل : دائما عبر stdin.

في التطبيق — عمليا — النشر في المكان الصحيح

  1. اختاروا السجل المناسب لحالتكم (Hub/GHCR/خاص).
  2. أنشئوا رمزا (token) محدود الصلاحيات (دفع/سحب).
  3. اتصلوا عبر --password-stdin.
  4. ادفعوا وسما ثابتا واسحبوه في مكان آخر للتحقق.
صوركم في المكان الصحيح، متاحة للأشخاص الصحيحين.

نص جاهز للقول — شرح اختيار السجل لمسؤولك (30 ثانية)

« معكم إدير : نشرت صورتنا على GHCR برمز محدود بالدفع والسحب، متصلا دون ترك أثر. ويسحب الإنتاج الاسم الكامل بالإصدار المثبت، فنعرف بالضبط أي صورة تدور. وإذا تسرب الرمز، أبطله بنقرة واحدة. »

يُقال عندما يُسأل لماذا لا « ندفع في العام فقط » : أظهروا حساسية الكود.

نموذج للنسخ واللصق — نشر إصدار (GHCR)

echo $GHCR_TOKEN | docker login ghcr.io -u moncompte --password-stdin
docker build -t ghcr.io/monequipe/app:1.2.0 .
docker push ghcr.io/monequipe/app:1.2.0
docker pull ghcr.io/monequipe/app:1.2.0

صورة مصدر مفتوح

مثل إدير لكن نحو Docker Hub في العام : يستطيع المجتمع السحب بحرية، وإصدار مثبت للثقة.

صورة داخلية حساسة

سجل الشركة الخاص، مستودع بوصول مقيد : لا تسحب إلا الفرق المخولة.

رمز تسرب

أبطلوا الرمز فورا، وأنشئوا جديدا محدودا، وتحققوا من الوصول — دون مس الحساب.

إنتاج يجب تدقيقه

اسم كامل + وسم ثابت مسجلان في compose الإنتاج : نعرف أي صورة تدور أين، في كل وقت.

حذر: رموز السجلات أسرار : خزنوها في أسرار CI (أو مدير أسرار)، وليست مثبتة في سكريبت ولا ملف compose ولا سير عمل أبدا — ومرروها دائما عبر --password-stdin. فأي خط أنابيب (pipeline) أو سجل يعرض سرا بالنص الصريح يُصحح باستعجال، ثم أبطلوا الرمز المكشوف.

✓ ممارسات جيدة

  • رموز محدودة، وليست كلمات مرور أبدا.
  • أسماء كاملة في الإنتاج.
  • الإبطال عند أدنى شك.

✗ أخطاء شائعة

  • الاتصال مع -p والسر مرئي (السجل).
  • صور داخلية مدفوعة في العام.
  • وسوم مختصرة غامضة في الإنتاج.

النقاط الأساسية

  • Hub = عام، وGHCR = CI، والخاص = داخلي.
  • رموز محدودة عبر --password-stdin.
  • اسم كامل + وسم ثابت في الإنتاج.
  • نبطل دون تردد.

تحدي 48 ساعة — طبّق غدا

انشروا صورة حقيقية : أنشئوا رمزا محدودا، واتصلوا عبر --password-stdin، وادفعوا وسم إصدار ثم اسحبوه من آلة أخرى.

قائمة الخروج من القسم
  • أستطيع اختيار السجل المناسب (Hub وGHCR والخاص).
  • أستطيع الاستيثاق برمز محدود عبر --password-stdin.
  • أستطيع دفع وسحب وسم ثابت قابل للتتبع.
تقييم ذاتي 1-5 : هل كشف اتصالي الأخير سرا في مكان ما ؟هل أستطيع قول أي صورة بالضبط تدور في الإنتاج ؟

أسئلة شائعة

لماذا --password-stdin بدلا من -p ؟

لأن -p يكشف السر في سجل الصدفة وسجلات CI. والأنبوب لا يترك أثرا : يعبر الرمز دون أن يظهر بالنص الصريح أبدا.

هل نحتفظ بالسجل نفسه في كل مكان ؟

لا : العام للمصدر المفتوح، وGHCR لأجل CI على GitHub، والخاص للداخلي الحساس. ويثبت compose الإنتاج الاختيار بأسماء كاملة.

تحقّق من فهمك

في CI، كيف نستوثق لدى السجل ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 4أسئلة جديدة وأصعب للتحقق من مكتسباتك