محتويات الدورة

Docker / أسس الصور والحاويات / الدرس 3

Dockerfile وسياق البناء و COPY

حدد ملفات البناء المتاحة وافصل تعليمات البناء عن سلوك التشغيل.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تتبّع مسارات COPY من جذر السياق واستخدم .dockerignore.
  • اقرأ تطبيقاً و Dockerfile كاملين دون تنفيذ البناء.

السياق حد مدخلات معلن

ضع app.py و Dockerfile في parcel-lab. يوفر سياق البناء ملفات COPY و ADD. يختار آخر معامل في docker build السياق وتختار -f موضع Dockerfile ولو كان في مكان آخر. يُقاس مسار المصدر من جذر السياق لا من مجلد Dockerfile أو المشروع المتذكر. وليست ملفات خارج السياق مدخلات مضيف متاحة عشوائياً.

عرّف خدمة التدريب كاملة

يستخدم المثال مكتبة Python القياسية ويستمع على كل واجهات الحاوية بالمنفذ 8080. يعيد كل GET نصاً اصطناعياً واحداً ولا ينفذ مصادقة أو فحص قاعدة أو جاهزية إنتاج. يوضح اكتمال البرنامج سلوك العملية والشبكة دون ملفات خفية. احفظه باسم app.py في المختبر الاختياري المعزول فقط؛ فالدورة تعرض الشيفرة ولا تنفذها.

python ملف app.py كامل
from http.server import BaseHTTPRequestHandler, HTTPServer

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"parcel-api\n")

HTTPServer(("0.0.0.0", 8080), Handler).serve_forever()
الناتج المتوقع
parcel-api

تبقى HTTPServer في المقدمة حتى الإيقاف. يحمل جسم GET الناجح parcel-api ثم سطراً جديداً. تتغير التواريخ والسجلات فلا نعرضها. يتيح الربط بـ 0.0.0.0 حركة واجهات الحاوية ولا ينشر منفذ المضيف وحده.

اقرأ وصفة الصورة بالترتيب

تختار FROM الأساس وتحدد WORKDIR المجلد وتضيف COPY المصدر وتختار USER هوية التشغيل وتحدد CMD العملية الافتراضية. توثق EXPOSE منفذ الحاوية ولا تفتح مستمعاً على المضيف. الوسم مدخل تعليمي مقروء لا تثبيت إصدار ثابت، ولا توجد خطوة تثبيت حزم أو تنزيل خفية في الوصفة.

dockerfile Dockerfile للخدمة الاصطناعية
# syntax=docker/dockerfile:1
FROM python:3.13-slim
WORKDIR /app
COPY app.py ./app.py
USER 10001:10001
EXPOSE 8080
CMD ["python", "-u", "app.py"]

تطلق CMD المصفوفية Python مباشرة دون غلاف صدفي. يتجنب المستخدم الرقمي الحاجة إلى اسم حساب هنا. يستطيع قراءة app.py، ويعالج درس لاحق مجلدات الكتابة منفصلة. لا ندعي معرّف صورة أو زمن بناء أو نجاح تشغيل.

استبعد المدخلات غير اللازمة والحساسة

تصفي .dockerignore عند جذر السياق الملفات. يقلل استبعاد .git والذاكرات والبيئات والأسرار الإدراج العرضي وإبطال البناء غير اللازم. يجب أن تُبقي الأنماط الملفات المطلوبة؛ فقاعدة *.py تزيل app.py وتفشل COPY. قواعد التجاهل وسيلة مساعدة لا بديل لفحص الصورة وتسليم الأسرار الصحيح.

راجع حسم المسار قبل تعديله

في docker build -f docker/Dockerfile . تقرأ COPY app.py الملف من جذر النقطة. وفي docker build -f Dockerfile src تقرؤه من src. لا ينقل تحريك الوصفة الحد تلقائياً. ارسم الشجرة وحدد الجذر وطبق التجاهل ثم احسب المصادر. يحل ذلك أخطاء الملفات دون توسيع السياق إلى مجلد المستخدم كله.

الأخطاء الشائعة وإصلاحها

COPY source was not found.

لماذا يحدث؟
يفتقد السياق app.py أو تستبعده .dockerignore.
كيف تصلحه؟
طابق السياق والمصدر النسبي وأبق المدخلات اللازمة فقط.
كيف تتجنب تكراره؟
وثق أمر البناء مع بنية المستودع وراجع التجاهل.

أُدرج ملف سر عبر COPY . .

لماذا يحدث؟
أدخل النسخ الواسع ملفات محلية غير مقصودة للصورة.
كيف تصلحه؟
دوّر السر المكشوف واستخدم مصادر محددة واستبعادات مدروسة.
كيف تتجنب تكراره؟
افصل الأسرار عن السياق وراجع تاريخ الصورة.

الخدمة غير متاحة رغم EXPOSE 8080.

لماذا يحدث؟
اعتُبرت EXPOSE نشراً للمنفذ أو تشغيلاً لمستمع.
كيف تصلحه؟
افحص المستمع وخطط منفصلاً لتعيين مضيف مصرح.
كيف تتجنب تكراره؟
ميّز بيانات الصورة وربط العملية والنشر الشبكي.

اختبر فهمك

1. يوجد Dockerfile داخل docker/ و app.py في الجذر؛ ما مصدر COPY المناسب؟

اعرض الحل المشروح

مع سياق الجذر تصح COPY app.py ./app.py حتى مع -f docker/Dockerfile. ليست COPY ../app.py طلباً لقراءة أي ملفات أب. اختر الحد أولاً؛ فلا يعيد موضع Dockerfile تعريفه.

2. لماذا يستخدم المثال CMD تنفيذية وخدمة في المقدمة؟

اعرض الحل المشروح

يشرف المحرك مباشرة على Python التي تبقى حية لخدمة الطلبات. يؤدي وضع الخادم في الخلفية ثم خروج الأمر إلى نهاية العملية الرئيسية والحاوية. ويتجنب التنفيذ المباشر التوسيع الصدفي العرضي ويسهل الإشارات، مع بقاء مسؤولية الإغلاق الصحيح على التطبيق.

أهم ما تعلمته

  • تتبع مصادر COPY جذر السياق وقواعد التجاهل.
  • تصف Dockerfile صورة ولا تثبت حدوث بناء أو نشر.

المراجع الرسمية