لماذا تحفظ أمر التشغيل في ملف Compose؟
عند إعادة نشر تطبيق، لا يكفي تذكّر اسم الصورة؛ يجب أيضًا استعادة المنافذ والمسارات ومتغيرات البيئة الصحيحة. يجمع compose.yaml هذه الإعدادات في حقول واضحة، لتسهيل مراجعتها وحفظ التغييرات في Git.
ينتج المحوّل تعريف خدمة واحدة من أمر واحد. لا يقرأ إعدادات الحاويات العاملة ولا يستنتج علاقات الاعتماد بين الخدمات. كما أن إنشاء الملف لا يغيّر أي حاوية على الخادم.
من لصق الأمر إلى فحص الملف
ابدأ بأمر docker run أو docker container run، مع الحفاظ على علامات الاقتباس وشرطات متابعة الأسطر. اسم الخدمة الاختياري يغيّر المفتاح تحت services فقط؛ أما الاسم المحدد بواسطة --name فيبقى في container_name.
اقرأ الملاحظات ثم انسخ YAML أو نزّله. راجع مواقع المجلدات والملفات المشار إليها وشغّل docker compose config. لتشغيل خدمة مستمرة في الخلفية استخدم بعد ذلك docker compose up -d. المهام المؤقتة التي تستخدم --rm لها طريقة تشغيل مختلفة.
تأكّد من الرجوع إلى البيانات الموجودة
تُحفظ أسماء وحدات التخزين المسماة كما هي وتُعلن باستخدام external: true. بذلك تُستخدم الوحدة الموجودة بدل إنشاء وحدة جديدة باسم يتضمن بادئة المشروع. يجب أن تكون الوحدة موجودة مسبقًا؛ في الإعداد الجديد أنشئها أولًا أو أزل هذا الحقل. المحوّل لا ينسخ البيانات.
تُفسّر المسارات النسبية انطلاقًا من مجلد ملف Compose. وتُعامل الشبكات المخصّصة أيضًا كموارد خارجية موجودة. إن لم تحدد شبكة، يبقى network_mode: bridge للحفاظ على شبكة Docker run الافتراضية. أزل الحقل إذا أردت شبكة المشروع التي ينشئها Compose والتواصل بأسماء الخدمات.
مثال Nginx: نشر منفذ وسياسة إعادة تشغيل
يربط المثال منفذ المضيف 8080 بمنفذ الحاوية 80. تُحفظ سياسة unless-stopped في YAML، بينما يُحدد التشغيل في الخلفية عبر -d عند إطلاق Compose، ولا يُكتب كحقل في الخدمة.
docker run -d --name web -p 8080:80 \
--restart unless-stopped nginx:alpineservices:
web:
image: "nginx:alpine"
container_name: "web"
ports:
- "8080:80"
restart: "unless-stopped"
network_mode: "bridge"
ما الذي ينبغي حسمه في الطرفية أولًا؟
الإدخال بصياغة POSIX مع الاقتباس والهروب ومتابعة الأسطر. لا ندعم PowerShell أو CMD أو الأنابيب أو عدة أوامر أو خيارات Docker العامة. استبدل المتغيرات و$(pwd) بالقيم الفعلية. لحفظ علامة الدولار حرفيًا احمها بالاقتباس المفرد أو الهروب؛ وتُكتب في Compose بصيغة $$.
يُحوّل --env-file باستخدام format: raw، ويتطلب Docker Compose 2.30.0 أو أحدث. لا يقرأ المحوّل محتوى الملفات ولا يفحص الصور أو المنافذ المشغولة. نجاح فحص الإعدادات لا يضمن تشغيل التطبيق.
خيارات Docker وما يقابلها في Compose
| خيار Docker | حقل Compose | المعنى |
|---|---|---|
IMAGE | image | الحفاظ على الصورة ووسمها |
--name | container_name | اسم الحاوية المحدد صراحة |
-p, --publish | ports | ربط منفذ المضيف بمنفذ الحاوية |
-e, --env | environment | القيم غير المحددة تُحل من بيئة التشغيل |
-v, --volume / --mount | volumes | ربط المجلدات ووحدات التخزين المسماة أو المجهولة |
--network | networks / network_mode | اسم الشبكة أو وضع الشبكة |
--restart | restart | سياسة إعادة التشغيل |
IMAGE [COMMAND] [ARG…] | command | الحفاظ على الوسائط ضمن قائمة |
أسئلة حول الانتقال إلى Compose
لماذا لا يوجد حقل version؟
يتبع الملف Compose Specification ويبدأ بـservices. لا يضيف حقل version القديم. استخدم الأمر الحديث docker compose للفحص.
كيف أحتفظ بسلوك --rm؟
للمهمة المؤقتة استخدم docker compose run --rm --service-ports SERVICE واستبدل SERVICE باسم الخدمة. يطبّق --service-ports ربط المنافذ المعرّف في الملف.
هل يتجاهل المحوّل الخيارات غير المدعومة؟
لا. خيارات مثل --gpus و--link وبعض إعدادات الربط المتقدمة توقف التحويل وتتطلب إعدادًا يدويًا، حتى لا تُحذف من الناتج دون تنبيه.
هل يمكن جمع عدة أوامر في ملف واحد؟
حوّل كل أمر منفصلًا ثم اجمع تعريفات الخدمات. راجع وحدات التخزين المشتركة والشبكات وأضف علاقات الاعتماد يدويًا.
هل تُرسل كلمات المرور إلى خادم؟
لا يُرفع الأمر المدخل؛ يتم التحويل في المتصفح. لكن القيم المدخلة تبقى في الملف الناتج، لذا راجعه قبل نشره في مستودع.
ماذا لو كانت حاوية تحمل الاسم نفسه تعمل بالفعل؟
التحويل لا ينفذ عمليات Docker. قبل تشغيل Compose، عالج تعارض أسماء الحاويات أو المنافذ المستخدمة.
وثائق Docker الرسمية: docker run · Compose · $$
