2.3ترقيم الإصدارات ونشر الصور
الأساسي في 30 ثانية
- رقّم أثناء البناء مع الحساب : حساب/صورة:إصدار هو العنوان الكامل — دون فضاء الاسم، لا push.
- ثابت لكل تسليم : وسم مجمّد ومختبَر لكل إصدار (1.2.0)، لا يُعاد كتابته أبدا — والأسماء المستعارة المتحركة للراحة فقط.
- أبدا سر مدفوع : فكل ما يدخل الصورة يرحل مع push — وpush علني لا رجعة فيه.
حالة مستمرة — إدير والإنتاج الذي كان يسحب latest
صورة إدير النحيفة (2.2) تعمل محليا، لكن الفريق كان يتشاركها يدويا، في latest، دون إصدار : فانحرف الإنتاج مرتين مسبقا. رقّم إدير أثناء البناء مع الحساب (moncompte/mon-app:1.2.0 مع الاسم المستعار 1.2)، واتصل بالسجل، ودفع الوسمين، ثم سحب 1.2.0 على جهاز آخر : بناء هنا، وتشغيل هناك، وإصدار مجمّد. وتحقّق من ظهور المستودع قبل الدفع. وفي 2.4، سيجعل هذه الصورة قابلة للإعداد ؛ وفي 2.5 سيتحقق أنها لا تحتوي أي سر قبل أي push جديد.
تتمة الخيط الرابط 2.2 : صورة إدير النحيفة تسافر برقم إصدار — وتستمر في 2.4 و2.5.
1. رقّم كمحترف
نرقّم أثناء البناء (-t moncompte/mon-app:1.2.0) ونضيف أسماء مستعارة مفيدة (1.2 وlatest في التطوير). والقاعدة : وسم ثابت لكل تسليم (1.2.0)، لا يُعاد كتابته أبدا ؛ والأسماء المستعارة المتحركة للراحة فقط. ويسحب الإنتاج دائما الوسم المجمّد والمختبَر، أبدا latest. جمّد إدير 1.2.0 وترك 1.2 تتبع التصحيحات.
2. النشر : login وpush وpull
docker login يوثّق، وdocker push moncompte/mon-app:1.2.0 ينشر، وأي جهاز يستردها عبر pull. والاسم حساب/صورة:وسم هو العنوان الكامل : فدون حساب (فضاء الاسم)، يُرفَض الدفع. دفع إدير وسميه ثم، على جهاز آخر (أو بعد rmi محلي)، سحب 1.2.0 وشغّلها : وهو الدليل أن الصورة تسافر.
3. علني أم خاص؟
افتراضيا على Hub، المستودع علني : مثالي للمصدر المفتوح، وممنوع للكود الداخلي. وللداخلي، مستودع خاص (Hub مدفوع، أو GHCR، أو سجل الشركة). وأبدا سر داخل الصورة : فسر COPY أو ENV يبقى في الطبقات ويرحل مع push — وpush علني لا رجعة فيه. راقب إدير الظهور قبل كل push وأبقى الأسرار خارج الصورة (2.5).
🔎 مثال ملموس — 🔎 مثال ملموس — نشر 1.2.0
صورة إدير، من الجهاز المحلي إلى السجل :
docker build -t moncompte/mon-app:1.2.0 -t moncompte/mon-app:1.2 .
docker login
docker push moncompte/mon-app:1.2.0
docker push moncompte/mon-app:1.2
# على جهاز آخر :
docker pull moncompte/mon-app:1.2.0
القراءة : 1.2.0 مجمدة ومختبَرة، و1.2 تتبع التصحيحات، وlatest تبقى راحة للتطوير.
الدرس : يسحب الإنتاج 1.2.0، أبدا latest — قابل للتكرار وقابل للتتبع.
مفردات القسم
- فضاء الاسم (Namespace)
- الحساب أو المنظمة قبل الصورة (moncompte/mon-app) : وهو العنوان الكامل المطلوب للدفع.
مثال بسيط: سبق إدير بالحساب منذ البناء.
ما ليس كذلك: وسم الإصدار وحده.
رد فعل: دون فضاء اسم = دون push.
- وسم ثابت (Tag)
- إصدار مجمّد لا يُعاد كتابته أبدا (1.2.0) : وهو ما يسحبه الإنتاج ليبقى قابلا للتكرار.
مثال بسيط: جمّد إدير 1.2.0 المختبَرة لأجل الإنتاج.
ما ليس كذلك: اسم مستعار متحرك مثل latest.
رد فعل: تسليم واحد = وسم مجمّد.
- اسم مستعار (Alias)
- وسم متحرك للراحة (1.2 وlatest) يتبع التصحيحات ؛ عملي في التطوير، وممنوع كمرجع للإنتاج.
مثال بسيط: ترك إدير 1.2 تتبع الترقيعات، وlatest للتجارب.
ما ليس كذلك: المرجع المنشور في الإنتاج.
رد فعل: راحة في التطوير، أبدا في الإنتاج.
- push / pull
- النشر نحو السجل (push) والاسترداد من السجل (pull) : ثالوث المشاركة مع login.
مثال بسيط: دفع إدير 1.2.0 وسحبها على جهاز آخر.
ما ليس كذلك: بناء محلي لا يُشارَك أبدا.
رد فعل: login وpush وpull : شارك بإصدارات.
في التطبيق — عمليا — انشر تطبيقك
- أعد بناء تطبيقك بوسمين (1.0.0 مجمّد و1.0 مستعار).
- اتصل بالسجل (docker login).
- ادفع الوسمين (docker push)، مع التحقق من الظهور.
- على جهاز آخر (أو بعد rmi)، اسحب 1.0.0 وشغّلها.
نص جاهز — افرض الوسم المجمّد (30 ثانية)
« لم نعد ننشر latest : فلكل تسليم وسمه المجمّد، المختبَر، الذي لا يُعاد كتابته أبدا — فـ 1.2.0 تعمل في الإنتاج، ونعرف بالضبط ماذا. وتبقى الأسماء المستعارة مثل 1.2 أو latest للراحة في التطوير. بناء هنا، وسحب هناك، ونفس الإصدار في كل مكان. »
يُقال مع عرض سحب 1.2.0 الخاصة بإدير على جهاز ثان.
قالب جاهز للنسخ — رقّم وانشر
docker build -t moncompte/mon-app:1.2.0 -t moncompte/mon-app:1.2 .
docker login
docker push moncompte/mon-app:1.2.0
docker push moncompte/mon-app:1.2
docker pull moncompte/mon-app:1.2.0
دفع مرفوض
دفع « denied » : يتحقق إدير من login، وفضاء الاسم حساب/صورة وحقوقه على المستودع.
داخلي في العلني
كود داخلي مدفوع في مستودع علني : يعيد إدير التمرير إلى الخاص (أو سجل الشركة) قبل الدفع.
وسم معاد كتابته
1.2.0 أُعيد دفعها بشكل مختلف بعد النشر : فيجمّد إدير 1.2.1 بدلا من إعادة كتابة التاريخ.
دفع عند كل commit
كل تجربة مدفوعة تلوّث السجل : فلا يدفع إدير إلا الإصدارات المختبَرة، وستفرز CI (المستوى 4).
✓ ممارسات جيدة
- وسم ثابت لكل تسليم، لا يُعاد كتابته أبدا.
- اسبق بالحساب منذ البناء.
- تحقق من الظهور (علني/خاص) قبل الدفع.
✗ أخطاء شائعة
- إعادة كتابة وسم منشور مسبقا (انحراف الإنتاج).
- الدفع في العلني لكود داخلي.
- تضمين أسرار في الصورة المدفوعة.
النقاط الأساسية
- نرقّم أثناء البناء مع الحساب (العنوان الكامل).
- ثابت لكل تسليم (1.2.0)، ومستعار (1.2 وlatest) للراحة.
- login ثم push ثم pull : ثالوث المشاركة بالإصدارات.
- أبدا سر في صورة مدفوعة (push علني لا رجعة فيه).
تحدي 48 ساعة — طبِّق غدا
انشر صورتك النحيفة (2.2) : بناء بوسمين (1.0.0 + 1.0)، وlogin + push مع التحقق من الظهور، ثم pull + run لـ 1.0.0 في مكان آخر.
- أستطيع الترقيم أثناء البناء (ثابت + مستعار، مع الحساب).
- أعرف النشر (login وpush) والاسترداد (pull) في مكان آخر.
- أراقب علني/خاص وأستبعد الأسرار قبل كل push.
أسئلة شائعة
لماذا يُرفَض دفعي (denied)؟
غالبا اسم دون فضاء اسم، أو دون login، أو دون حقوق على المستودع. تحقق من docker login، والاسم حساب/صورة:وسم وحقوق الكتابة على المستودع قبل إعادة المحاولة.
هل ندفع عند كل commit؟
لا : ندفع الإصدارات المختبَرة (أوسمة مجمدة)، لا كل تجربة. وستؤتمت CI (المستوى 4) هذا الفرز : فتبني عند كل commit لكنها لا تنشر إلا الإصدارات المعتمدة.
ما سياسة الأوسمة للإنتاج؟