المكاسب:
- القدرة على فهم مفاهيم الحاوية وDockerfile والتعليمات الأساسية ومنطق الطبقة، وجعل الذكاء الاصطناعي ينتج ملف Dockerfile جاهزًا للإنتاج
- القدرة على تقليل حجم الصورة وزيادة سرعة النشر والأمان من خلال إنشاء متعدد المراحل وصورة أساسية صغيرة
- القدرة على تطبيق المبادئ الأمنية المتمثلة في عدم تضمين السر في الصورة، وتشغيلها مع مستخدم غير مصرح به بدلاً من الجذر، ومسح الصورة ضوئيًا
الجملة "كان يعمل على جهاز الكمبيوتر الخاص بي" هي الجملة الأكثر تكلفة في تاريخ البرمجيات. ينفجر نفس الرمز على خادم مختلف بسبب إصدار مكتبة مختلف. تعمل تقنية الحاوية على حل هذه المشكلة تمامًا: فهي تضع تطبيقك بكل ما يحتاجه للتشغيل - المكتبات ووقت التشغيل والإعدادات - في حزمة محمولة واحدة. تعمل هذه الحزمة بنفس الطريقة تمامًا في كل مكان. أداة الحاوية الأكثر شيوعًا هي Docker.
يُطلق على وصف الحاوية اسم Dockerfile: وهو ملف نصي يشرح الترتيب الذي سيبدأ منه التطبيق الخاص بك، والملفات التي سيتم نسخها، والأوامر التي سيتم تشغيلها. ويتم إنتاج صورة من هذه الوصفة؛ عند تشغيل الصورة، تصبح حاوية. يتمتع الذكاء الاصطناعي بمهارة كبيرة في كتابة ملف Dockerfile، والأهم من ذلك، تصغيره وتأمينه. لكن مهمتك هي فهم ما تفعله الوصفة التي تم إنشاؤها وأين يمكن أن تسرب الأسرار.
التعليمات الأساسية لملف Dockerfile
لتدقيق ملف Dockerfile، يجب أن تعرف التعليمات الأساسية:
- `من`: يحدد الصورة الأساسية (على سبيل المثال python:3.12-slim). هذا هو المكان الذي يأتي منه حجم الصورة وأمانها إلى حد كبير.
- `WORKDIR`: يحدد دليل العمل.
- `COPY` / `ADD`: نسخ الملفات إلى الصورة.
- `RUN`: تشغيل أمر أثناء الإنشاء (على سبيل المثال، تثبيت تبعية). تقوم كل عملية RUN بإنشاء طبقة جديدة.
- `ENV`: يحدد متغير البيئة.
- `EXPOSE`: المستندات التي تستمع إليها الحاوية.
- `CMD` / `ENTRYPOINT`: يحدد الأمر الذي سيتم تشغيله عند بدء تشغيل الحاوية.
المفهوم الحاسم هو الطبقة: يقوم Docker بتخزين كل تعليمات مؤقتًا كطبقة. إذا وضعت الخطوات المتغيرة بشكل متكرر في النهاية، فستأتي الطبقات غير المتغيرة من ذاكرة التخزين المؤقت وسيتسارع البناء.
نصيحة: أكبر عاملين لتقليل حجم الصورة هما: (1) اختيار صورة أساسية صغيرة مثل صورة نحيفة أو جبال الألب؛ (2) استخدام البناء متعدد المراحل - التخلي عن أدوات البناء في مرحلة واحدة ونقل المنتج النهائي إلى صورة رفيعة فقط. يستطيع الذكاء الاصطناعي تنفيذ هذين الأمرين بخبرة وقتما يريد.
لماذا تعتبر الصورة الصغيرة مهمة جدًا؟ لأن حجم الصورة ليس مجرد مشكلة في القرص. تستغرق الصورة الكبيرة وقتًا أطول في السحب مع كل عملية نشر، وتشغل مساحة أكبر في السجل، وتبطئ بدء تشغيل Pods الجديدة أثناء توسعها، ولأنها تحتوي على المزيد من الحزم، فإنها توفر سطح هجوم أكبر - أي مساحة مفتوحة يمكن للمهاجم استغلالها. استخدام صورة بحجم 100 ميجا بايت بدلاً من صورة بحجم 1 جيجا بايت؛ فهو يختصر وقت النشر ويقلل التكاليف ويزيد الأمان. يؤدي تحسين ملف Dockerfile إلى جني هذه الفوائد الثلاثة في وقت واحد. اذكر بوضوح هدف "أصغر صورة نهائية" عند مطالبة الذكاء الاصطناعي بملف Dockerfile محسّن؛ وبالتالي، فإنه يعطي الأولوية لفصل مرحلة التجميع والتخلص من الحزم غير الضرورية.
خطوة بخطوة: إنشاء ملف Dockerfile وتحسينه باستخدام الذكاء الاصطناعي
- وصف التطبيق. اللغة، الإصدار، أمر الإدخال، منفذ الاستماع.
- قم بإنتاج المسودة الأولى. اطلب ملف Dockerfile عمليًا بسيطًا.
- تحسينه. اطلب من نفس الذكاء الاصطناعي إنشاء متعدد المراحل وصورة أساسية بسيطة وتحسين ترتيب الطبقات.
- تحقق من الأمن. هل السر مضمن، هل يعمل كجذر، هل هناك أي أدوات غير ضرورية؟
- بناء وقياس الحجم. شاهد الحجم باستخدام صور عامل الإرساء بعد إنشاء عامل الإرساء.
- مسح. تحقق من وجود ثغرات أمنية معروفة باستخدام ماسح ضوئي للاستغلال مثل docker scout أو trivy.
الأمن: المخاطر الخاصة بالحاويات
من السهل التغاضي عن أمن الحاويات. ثلاث قواعد:
- لا تقم بتضمين سر في الصورة. خطوط مثل ENV API_KEY=... أو COPY .env تكتب السر بشكل دائم في طبقات الصورة؛ ويمكن لأي شخص يحصل على الصورة أن يقرأها. قم بإعطاء السر في وقت التشغيل كمتغير بيئة أو من المخزن.
- تشغيل كجذر. بشكل افتراضي، تعمل الحاويات كجذر؛ يمكن أن تتحول الفتحة إلى هروب من الحاوية. قم بالإسقاط إلى مستخدم غير مصرح به باستخدام تعليمات المستخدم.
- صورة أساسية صغيرة وحديثة. الصور المتضخمة أبطأ وتحتوي على المزيد من نقاط الضعف. حدد Slim/Alpine، وأصلح الإصدار (لا تستخدم:latest).
تحذير: حتى إذا استخدمت سرًا في RUN ثم قمت بحذفه، فإنه يظل في البرنامج الوسيط ويمكن قراءته مرة أخرى عبر سجل عامل الإرساء. إذا كان السر مطلوبًا أثناء الإنشاء، فاستخدم آلية Docker --secret، وليس ENV/COPY.
جدول تأثير التحسين
تقني
ماذا يفعل
تأثير نموذجي
صورة قاعدة نحيفة/جبال الألب
يتجاهل الحزم غير الضرورية
900 ميجابايت → 120 ميجابايت
بناء متعدد المراحل
يستبعد أدوات البناء
700 ميجابايت → 90 ميجابايت
.dockerignore
لا يتضمن الملفات غير الضرورية في البناء
بناء أسرع، سياق صغير
فرز الطبقة
يزيد من ضرب ذاكرة التخزين المؤقت
بناء 5 دقائق → 40 ثانية
إصلاح الإصدار (:15)
التكرار + الأمن
يمنع التدهور المفاجئ
ثلاث حالات صغيرة
الحالة 1 - صورة بحجم 1.1 جيجابايت تم تقليلها إلى 95 ميجابايت. كانت صورة Node.js لأحد الفرق بحجم 1.1 جيجابايت؛ استغرق كل نشر دقائق. قالوا لمنظمة العفو الدولية "قم بتحسين هذا من خلال البناء متعدد المراحل وجبال الألب". قام الذكاء الاصطناعي بفصل مرحلة التجميع ونقل الملفات التي تم إنشاؤها فقط إلى الصورة الرفيعة؛ وكانت النتيجة 95 ميجابايت، وانخفض وقت النشر بمقدار الثلث.
الحالة 2 - تم اكتشاف سر مدفون. لاحظ أحد المهندسين السطر ENV DB_PASSWORD=prod_secret في ملف Dockerfile الذي تنتجه YZ. قام الذكاء الاصطناعي بدمج كلمة المرور في الصورة حتى "تعمل". قام المهندس بإزالة هذا وتغييره إلى قراءة كلمة المرور من متغير البيئة في وقت التشغيل. وبخلاف ذلك، يمكن لأي شخص التقط الصورة قراءة كلمة المرور.
الحالة 3 - خطر هروب الجذر. أفادت إحدى أدوات المسح أن الصورة التي تم إنتاجها بواسطة الذكاء الاصطناعي كانت تعمل كجذر وتحتوي على ثغرة أمنية حرجة. أضاف الفريق مستخدم التطبيق USER ودفع الصورة الأساسية إلى الإصدار الحالي؛ مسح مسح. الدرس المستفاد: قم بمسح كل صورة ضوئيًا قبل نشرها وعرضها لمستخدمين غير مصرح لهم.
أربعة قوالب قابلة للنسخ
1) إنشاء ملف Dockerfile المُحسّن:
اكتب ملف Dockerfile جاهزًا للإنتاج لتطبيق [اللغة/الإطار]. الإرشادات: - استخدم البناء متعدد المراحل؛ اجعل الصورة النهائية أصغر ما يمكن. - الصورة الأساسية ضئيلة/جبالية والإصدار ثابت (لا تستخدم ": الأحدث"). - قم بتشغيل الحاوية مع مستخدم غير مصرح به، وليس الجذر. - لا تقم أبدًا بتضمين السر في الصورة؛ انتظر متغير البيئة في وقت التشغيل. - إضافة اقتراح .dockerignore. أمر الإدخال: [X]، منفذ الاستماع: [Y].
2) تحسين ملف Dockerfile الحالي:
تحقق من ملف Dockerfile هذا لتقليل حجمه وتسريعه. التوصية بإجراء تغييرات ملموسة من حيث ترتيب الطبقات والبناء متعدد المراحل والصورة الأساسية والحزم الزائدة عن الحاجة؛ اكتب الحجم/السرعة المقدرة لتأثير كل تغيير. ملف الإرساء: [المحتوى]
3) التدقيق الأمني:
تحقق من ملف Dockerfile هذا للأمان: هل هناك أي أسرار مضمنة، أو مستخدمين جذريين، أو إصدارات غير ثابتة، أو أدوات غير ضرورية، أو صور أساسية قديمة؟ قم بإدراج النتائج حسب الأهمية وأي تصحيحات. ملف الإرساء: [المحتوى]
4) بناء حل الأخطاء:
ما الذي يسبب خطأ بناء عامل الإرساء وكيفية حله؟ أعطني السبب الجذري والحل مع الحد الأدنى من التغييرات. لا تنتج قيمة حقيقية حيث ترى السر، استخدم العنصر النائب. خطأ: [سجل] ملف Dockerfile: [المحتوى]
موجه ضعيف / موجه قوي
ضعيف: "اكتب ملف Dockerfile لتطبيق Node الخاص بي."
النتيجة: صورة أساسية ضخمة، مستخدم جذر، مرحلة واحدة، من المحتمل أن تكون عرضة للسرية؛ إخراج دون النظر إلى الحجم والأمن.
Strong: "اكتب ملف Dockerfile جاهزًا للإنتاج لتطبيق Node 20 الخاص بي: بناء متعدد المراحل، العقدة: 20 صورة أساسية لجبال الألب (إصدار ثابت)، التشغيل مع مستخدم غير مصرح به، تضمين سري، الاستماع على المنفذ 3000، عقدة تسجيل الدخول dist/server.js. اقترح أيضًا .dockerignore."
الفرق: الإصدار الثاني من الموجه يوفر تقنية التحسين وقاعدة الأمان وأمر تسجيل الدخول؛ يصبح الإخراج صغيرًا وآمنًا وقابلاً للاستخدام مباشرة.
الأخطاء الشائعة
- تضمين السر في الصورة باستخدام `ENV`/`COPY`. يبقى في الطبقات ويتم قراءته مرة أخرى.
- تشغيل كجذر. يعد تخطي تعليمات المستخدم خطرًا أمنيًا خطيرًا.
- باستخدام `:الأحدث`. فهو يخلق بنيات غير متكررة واضطرابات غير متوقعة.
- تخطي البناء متعدد المراحل. تعمل أدوات التجميع على تضخيم الصورة النهائية دون داعٍ.
- لا تكتب ".dockerignore". يتم تضمين أدلة ضخمة مثل .git وnode_modules في البناء.
- نشر الصورة دون مسحها ضوئيا. إنتاج نقاط الضعف المعروفة دون إدراكها.
باختصار
تضع الحاويات التطبيق في حزم محمولة تعمل بنفس الطريقة في كل مكان؛ الوصفة هي ملف Dockerfile. يتمتع الذكاء الاصطناعي بالقوة في إنتاج ملفات Dockerfiles المحسنة والجاهزة للإنتاج - ولكنك تحتاج إلى طلب إنشاءات متعددة المراحل بشكل صريح، وصور أساسية صغيرة، وعدم وجود مستخدمين غير مصرح لهم، وعدم وجود أسرار. يؤدي تقليل حجم الصورة إلى تسريع النشر؛ عدم تضمين السر والهروب من الجذر ومسح الصورة يضمن الأمان. تقع على عاتقك مسؤولية التحقق مما تفعله كل وصفة وأين تتسرب.
مهمة التطبيق
اختر تطبيقًا بسيطًا. اطلب من الذكاء الاصطناعي إنشاء ملف Dockerfile باستخدام قالب "إنشاء ملف Dockerfile المحسّن". ثم: (1) قم بالتحقق من السر المضمن والمستخدم الجذري باستخدام قالب "التحقق من الأمان"؛ (2) قم ببناء عامل الإرساء، إن أمكن، وقياس الحجم باستخدام صور عامل الإرساء؛ (3) لاحظ التقنية التي ستكون أكثر فعالية في تصغير الصورة كخطوة تالية.
قائمة مرجعية
- [ ] أضفت إصدار اللغة/إطار العمل، وأمر الإدخال، والمنفذ إلى الموجه الخاص بي.
- [ ] لا توجد أسرار مضمنة في ملف Dockerfile؛ المتوقع في وقت التشغيل السري.
- [ ] الحاوية تعمل مع مستخدم غير مصرح به، وليس مع الجذر.
- [ ] الصورة الأساسية صغيرة (نحيفة/جبال الألب) ونسختها ثابتة (رقم: الأحدث).
- [ ] لقد استخدمت بناء متعدد المراحل و.dockerignore.
- [ ] لقد قمت بمسح الصورة ضوئيًا باستخدام ماسح ضوئي للثغرات الأمنية.