الصق أمر docker run واحصل على تعريف خدمة Compose جاهزًا للاستخدام: المنافذ ووحدات التخزين والبيئة والشبكات وفحص الصحة وسياسة إعادة التشغيل، محوّلة في متصفحك.
حوّل أمر docker run طويلاً إلى ملف Compose يمكنك الالتزام به. الصق الأمر تمامًا كما تكتبه، بما في ذلك متابعات الأسطر. العلامات التي لا يوجد لها مقابل في Compose تُدرج كملاحظات بدلاً من إسقاطها بصمت.
ملاحظات التحويل
من أمر مخصص إلى ملف قابل للتكرار
لماذا الترجمة ليست ميكانيكية بحتة
أمر docker run وخدمة Compose يصفان الحاوية نفسها، لكنهما يجيبان عن أسئلة مختلفة. الأمر يقول ماذا تفعل الآن. الملف يقول ما يجب أن يكون صحيحًا كلما كانت هذه الخدمة تعمل. معظم العلامات تُنقل بشكل نظيف، والتي لا تُنقل دائمًا هي تقريبًا التي تصف فعل التشغيل نفسه وليس الحاوية.
أوضح مثال هو الفصل. كتابة -d تخبر الخادم ألا يمسك طرفيتك، وهي خاصية لتلك الاستدعاء، وليست للخدمة. في Compose يُعبَّر عن نفس النية في سطر الأوامر بـ docker compose up -d، لذا تختفي العلامة ببساطة من الملف. وينطبق الشيء نفسه على --rm، الذي يطلب التنظيف بعد هذا التشغيل المعين؛ ومكافئه في Compose هو تشغيل docker compose down عندما تنتهي.
العلامات التفاعلية تقع في المنتصف. كل من -i و -t لهما مفتاحان في Compose، stdin_open و tty، لأن إبقاء قشرة مرفقة يمكن أن يكون خاصية حقيقية لخدمة. تُحوَّل بدلاً من إسقاطها، رغم أن معظم الخدمات طويلة التشغيل لا تحتاجها.
الاقتباسات هي حيث تنكسر التحويلات
السبب الأكثر شيوعًا لتحويل مكسور هو اقتباس قشرة ضاع قبل لصق الأمر. تأمل فحص الصحة: أمر الاختبار كامل يجب أن يصل كوسيطة واحدة، ولهذا يُلف في اقتباسات على سطر الأوامر. الصقه دون الاقتباسات وتصبح الكلمات وسائط منفصلة، ويُقرأ اسم الصورة من موضع خاطئ، وتكون النتيجة هراء.
يحلل المحوّل الإدخال كما تفعل القشرة، محترمًا الاقتباسات المفردة والمزدوجة وهروب الخط المائل الخلفي ومتابعات الخط المائل الخلفي والخط الجديد، لذا يحافظ الأمر المنسوخ مباشرة من برنامج نصي على بنيته. ثم يعيد اقتباس القيم في المخرج وفقًا لقواعد YAML، وهو ما يهم أكثر مما يتوقع الناس. يجب اقتباس تعيين منفذ مثل 8080:80 في YAML، لأن الزوج المفصول بنقطتين غير المقتبس غامض وقد قرأت المحللات الأقدم قيمًا مثل 22:00 كرقم ستيني.
الشبكات، وما لا يمكن للملف معرفته
معالجة الشبكات هي المكان الوحيد الذي ما زال فيه التحويل الأمين يحتاج قرارًا منك. إذا انضم الأمر إلى host أو none أو bridge، فهذا وضع ويصبح network_mode. أي اسم آخر يشير إلى شبكة موجودة بالفعل، لذا تحصل الخدمة على إدخال networks ويعلن الملف أن تلك الشبكة خارجية.
هذا الإعلان عبارة عن بيان حول بيئتك: يقول إن الشبكة مُدارة خارج هذا الملف. إذا كنت تفضل أن ينشئ Compose الشبكة ويمتلكها، فاحذف علامة external واتركها تُعرف بشكل طبيعي. لا يمكن للمحوّل أن يخبرك بأيهما تريد، لأن الأمر الأصلي يثبت فقط أن الشبكة كانت موجودة في لحظة تشغيله.
ينطبق نفس التحذير على وحدات التخزين المرتبطة. مسار مثل /srv/site يعمل على الجهاز الذي كُتب فيه الأمر ولا يعمل في أي مكان آخر. بمجرد أن تعيش الخدمة في ملف يُلتزم به ويُشارك، تكون المسارات النسبية أو وحدات التخزين المسماة عادةً الخيار الأفضل.
الأسئلة الشائعة
لماذا اختفت علامة -d من المخرج؟
الفصل يصف كيف تبدأ حاوية، وليس ما هي الحاوية. في Compose تعبر عن الشيء نفسه بتشغيل docker compose up -d، لذا فهو لا ينتمي إلى الملف.
هل يمكنني لصق أمر متعدد الأسطر بخطوط مائلة خلفية؟
نعم. متابعات الخط المائل الخلفي والخط الجديد تُدمج قبل التحليل، لذا يمكنك نسخ أمر مباشرة من برنامج قشرة نصي أو وثائق دون إعادة تنسيقه.
لماذا منافذي ملفوفة في اقتباسات؟
تعامل YAML الزوج المفصول بنقطتين غير المقتبس على أنه غامض، وتقرأ بعض المحللات قيمًا مثل 22:00 كرقم. اقتباس تعيينات المنافذ هو الطريقة الموثقة لإبقائها دقيقة.
ماذا تعني external: true على الشبكة المولّدة؟
تخبر Compose أن الشبكة موجودة بالفعل ولا يجب إنشاؤها أو إزالتها بواسطة هذا الملف. إذا أردت أن يدير Compose الشبكة بنفسه، فاحذف تلك العلامة.
هل تُتجاهل العلامات غير المدعومة بصمت؟
لا. أي شيء لا يمكن للمحوّل تعيينه يُدرج تحت ملاحظات التحويل حتى تقرر ما تفعله به، بدلاً من اكتشاف الإغفال لاحقًا.
هل يُرفع أمري إلى أي مكان؟
لا. كل من التحليل وتوليد YAML يعملان في متصفحك برمز مكتوب يدويًا، لذا لا يغادر الأمر الصفحة أبدًا.