4.1السجلات : Hub و GHCR والسجل الخاص
الأساسي في 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 الإنتاج.
تحقق بعد السحب : الصورة المشغلة تطابق الوسم المطلوب فعلا. فالوسم المتحرك في الإنتاج نشر لا يمكن إعادته ولا تدقيقه.
🔎 مثال ملموس — 🔎 مثال ملموس — الدفع نحو 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.
في التطبيق — عمليا — النشر في المكان الصحيح
- اختاروا السجل المناسب لحالتكم (Hub/GHCR/خاص).
- أنشئوا رمزا (token) محدود الصلاحيات (دفع/سحب).
- اتصلوا عبر --password-stdin.
- ادفعوا وسما ثابتا واسحبوه في مكان آخر للتحقق.
نص جاهز للقول — شرح اختيار السجل لمسؤولك (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 الإنتاج : نعرف أي صورة تدور أين، في كل وقت.
✓ ممارسات جيدة
- رموز محدودة، وليست كلمات مرور أبدا.
- أسماء كاملة في الإنتاج.
- الإبطال عند أدنى شك.
✗ أخطاء شائعة
- الاتصال مع -p والسر مرئي (السجل).
- صور داخلية مدفوعة في العام.
- وسوم مختصرة غامضة في الإنتاج.
النقاط الأساسية
- Hub = عام، وGHCR = CI، والخاص = داخلي.
- رموز محدودة عبر --password-stdin.
- اسم كامل + وسم ثابت في الإنتاج.
- نبطل دون تردد.
تحدي 48 ساعة — طبّق غدا
انشروا صورة حقيقية : أنشئوا رمزا محدودا، واتصلوا عبر --password-stdin، وادفعوا وسم إصدار ثم اسحبوه من آلة أخرى.
- أستطيع اختيار السجل المناسب (Hub وGHCR والخاص).
- أستطيع الاستيثاق برمز محدود عبر --password-stdin.
- أستطيع دفع وسحب وسم ثابت قابل للتتبع.
أسئلة شائعة
لماذا --password-stdin بدلا من -p ؟
لأن -p يكشف السر في سجل الصدفة وسجلات CI. والأنبوب لا يترك أثرا : يعبر الرمز دون أن يظهر بالنص الصريح أبدا.
هل نحتفظ بالسجل نفسه في كل مكان ؟
لا : العام للمصدر المفتوح، وGHCR لأجل CI على GitHub، والخاص للداخلي الحساس. ويثبت compose الإنتاج الاختيار بأسماء كاملة.
في CI، كيف نستوثق لدى السجل ؟