كما يمكن رؤيته في https://github.com/docker/compose/issues/4315 ، يبدو أن الميزة extends
الموجودة في docker-compose
تحظى بشعبية بين المستخدمين على الرغم من عيوبها. ومع ذلك ، لم تتم إضافته حتى الآن في تطبيق Engine لتنسيق Compose. حتى الآن ، نصحنا المستخدمين بتسوية هيكل ملف Compose عند استخدام الإصدار 3 ، ولكن هل هذا هو الحل طويل المدى الذي نريد أن نتبعه؟ كيف يمكننا توفير مسار ترقية واضح للمستخدمين الذين يعتمدون على هذه الميزة؟
تضمين التغريدة
لقد أضفت بعض الملاحظات https://github.com/docker/compose/issues/4315#issuecomment -280617251 إليّ مع إعادة الامتداد كما هو موجود حتى إصدار docker إنشاء ملف 2.1 ليس فكرة جيدة ولكن الميزة الرئيسية أنا Miss هو أن تكون قادرًا على الإعلان عن خدمات مجردة (لا ينبغي أبدًا تشغيلها ولكن يمكن استخدامها لتجميع الخصائص المشتركة للخدمات من أجل الراحة).
تمت الموافقة على التعليقات الواردة من عامل الإرساء / إنشاء # 4315 على أن الطريقة التي يعمل بها extends
كانت بسيطة بعض الشيء.
لن أوصي بحل ، ولكن FWIW ، لإظهار مدى إساءة الاستخدام ، إليك الاتفاقيات التي تزين الجزء العلوي من ملف الإنشاء لدينا:
#
# Docker Compose configuration
#
# Due to lack of "expressivity" in Compose, we define our own couple of service
# "pseudo-types":
#
# - image-only services (name: *-image)
#
# The only goal of these is to build images. No other services build images.
#
# These have entrypoint overridden to exit immediately.
#
# - base services (name: *-base)
#
# These contain common configuration and are intended to be extended.
#
# Their command (not entrypoint, to keep the original one) is overridden to
# exit immediately. Service must support a command to exit immediately.
#
# - task services (name: *-task)
#
# These are intended for running one-off commands.
#
# Their default command is overridden to exit immediately. Service must
# support a command to exit immediately.
#
# - "real" services
#
# These are actual services that stay up and running.
#
version: '2'
services:
...
أعتقد أن الامتدادات كما في v2.1 هي اختيار جيد. الامتداد هو في الواقع أمر بسيط ومفهوم ، وهذا ممارسة جيدة جدًا لكل بيئة للحصول على تحول بسيط ومقروء بين dev و prod و env.
في الحقيقة انه بحوزتي
هذا يعمل ، وأنا لا أفهم لماذا يجب أن نبحث في هذه التذكرة عن إعادة كتابة كاملة ، ولكن أكثر من الاحتفاظ بميزة التوسط. يعد الامتداد جزءًا جيدًا مع حالات الاستخدام الخاصة التي لا تستطيع التقنيات الأخرى حلها بسهولة. أنا سعيد بتوسيع الاحتمالات.
يمنعنا من الترقية إلى تنسيق v3.x أيضًا.
نحتفظ بتعريفات حاوية عامل الإرساء الخاصة بنا في تخطيط مجلد لكل مثيل ، حيث يحتوي كل مجلد على docker-compose.yml
الذي يحدد خصائص env لمثيل الحاوية في متناول اليد. لاستخراج العناصر الشائعة (DRY) ، نستخدم تعريفات الخدمة الأساسية في مجلد رئيسي ونستخدم extend
.
لذلك عندما أحتاج إلى إدارة مثيل حاوية معين ، فأنا فقط بحاجة إلى cd
في المجلد الصحيح ويمكن بعد ذلك مباشرة تشغيل أوامر docker-compose دون مزيد من التكوين (لا تتطلب أعلام -f
ذلك أعضاء الفريق بحاجة إلى البحث أو المعرفة ، يعمل فقط كما هو متوقع خارج الصندوق).
لقد منعت من استخدام ملفات إنشاء الإصدار 3.
أستخدم services.yml
لتحديد التخطيط الأساسي لخدماتي ثم توسيع ذلك بـ dev.services.yml
أجل بيئة التطوير الخاصة بي (غالبًا ما تضيف وحدات تخزين) ولكني أحب إعادة استخدام (DRY) للتمديدات عندما كانت كذلك مضاف. إنها ليست صفقة رابحة ولكنها ستمنعني من الانتقال إلى الإصدار 3 ما لم تكن هناك ميزة ضرورية.
أنا لست ضد تحسين الإصدار v2.1 من حل "الامتداد" بشيء أكثر ملاءمة. يمكن أن يكون شيء مثل الخدمات المجردة أكثر أمانًا في الاستخدام وأكثر قوة.
على سبيل المثال (نظرًا لأنها مجردة) يمكنني تخيل دعم وحدات التخزين / نقاط التحميل / الشبكات المجردة ، حيث تحدد الخدمة الأساسية المجردة نقطة تحميل محلية أو شبكة مطلوبة لخدمة ما ، دون تحديد جزء المضيف - مما يعني أن الخدمة المشتقة يمكن أن تحدد / قم بتعيين الجزء المضيف من التركيبات / الأحجام والشبكات إلى ما هو مناسب في بيئة المضيف / المرحلة الخاصة به.
هذا مثال على شيء لا يمكننا فعله الآن مع "الامتدادات" بقدر ما أعرف ، وسيفتح بعض الاحتمالات المثيرة للاهتمام.
لم تكن ميزة الاستغناء عن الامتدادات مفيدة على الإطلاق. لدينا الكثير من خدمات الويب التي بدأت بنفس الأحجام المعينة ، ومجموعة متغيرات البيئة والتسميات. لديهم أيضًا نفس سياسات الفحص الصحي. ناهيك عن الموانئ. يعد دمج ملفات الإنشاء باستخدام خيار متعدد - f أمرًا مملًا وعرضة للخطأ إذا كنت تتعامل مع مشاريع متعددة في نفس المضيف.
@ shin- هل سيعاد هذا إلى المخطط 3.2؟
أود حقًا إعادة extends
إلى تنسيق الملف. لقد كنت أستخدمه لتحسين الخدمات المجردة بشكل أكبر لعدد من المشاريع. أتفهم أن خيارات -f
المتعددة تناسب الفاتورة تقريبًا ، لكنها لا تعمل دائمًا. على سبيل المثال ، غالبًا ما أقوم بتغيير اسم الخدمة المجردة إلى شيء أكثر أهمية في سياق المشروع قيد البحث. هذا شيء لا يدعمه التجاوز الذي يحدث مع خيارات -f
المتعددة.
لا أمانع في خسارة extends
بالضبط ، طالما أنها طريقة أخرى لـ "إنشاء مثيل" لخدمة مجردة في ملف.
لدي إعداد مع ملف خدمة مشترك ومجموعة من الخدمات التي تمدها ، وتغير في الغالب الأحجام ، لذلك أود أن أقول إنني أعتمد على ميزة extends
ولا أرى طريقة جيدة أخرى لوصف الإعداد الخاص بي.
--frustrated
+1
يمكنني رؤية المنطق الكامن وراء التوصية بتسوية ملفات إنشاء عامل ميناء ، لكنني لا أحب فكرة تكرار الكود الذي يحدد طوبولوجيا خدمة التطوير لدينا عبر مشاريع متعددة. سنستخدم الحل البديل -f في الوقت الحالي ، مع البرامج النصية للصدفة بحيث لا يضطر المطورون إلى تذكر الخدمات التي يجب تضمينها في أي الحالات.
آمل أن يتم العثور على حل مرض هنا لتمكين تحليل هياكل التركيب بشكل أفضل!
في الجزء العلوي من قائمة حالات الاستخدام الخاصة بي ، توجد مجموعة خدمات DRYup التي يديرها التكوين الخاص بي. اعتقدت أنني سأكون قادرًا على الاستفادة من "الامتداد" إذا كان الإصدار 3. لا أريد العودة إلى الإصدار 2 ... ولا أريد أن يكون لدي حالات خاصة حيث يجب أن أستخدم الحل البديل للعملية -f.
مرحبًا ، هل بدأ أحد العمل على هذا؟ لا يمكنني العثور على علاقات عامة لتتبعها. سيبسط الكثير من الأشياء بالنسبة لنا هنا أيضًا (حالة الاستخدام تشبه إلى حد بعيد بعض الحالات الموضحة أعلاه).
نظرًا لأن الإصدار 3 تم تجميده وكنت بحاجة إلى طريقة لمشاركة التكوين المشترك ، فقد اخترقت حلًا صغيرًا ، أعتقد أنه يمكنني مشاركته هنا (لست متأكدًا مما إذا كان هذا هو المكان المناسب ولكن لا تتردد في إخباري أين يمكنني ذلك شارك هذه المعلومات :))
لن أتناولها بالتفصيل هنا ، نظرًا لوجود ملف تمهيدي في الريبو.
أتمنى لك واحدة لطيفة ، الجميع ☮️
+1
+1
+1
شكرا على 1s 💃
في غضون ذلك ، عثرت على صورة docker noop أخرى ، والتي كانت أصغر بمعامل 10 ^ 3 (نظرًا لأن noop الفعلي يتم كتابته في التجميع).
لسوء الحظ ، لا يوجد ترخيص في هذا الريبو. لقد كتبت بالفعل رسالة إلى المالك على facebk لكنه لم يرد بعد. ربما سيضيف ترخيصًا إذا سأله المزيد من الأشخاص عنه :)
شيء قد يساعد بعض حالات الاستخدام الممتدة (تلك الموجودة في ملف واحد) سيكون دعمًا لمثبتات YAML: https://learnxinyminutes.com/docs/yaml/
يبدو أن مخطط JSON ربما أخفق في التحقق من صحتها service must be a mapping, not a NoneType.
.
مرحبًا ، grayside ، تعمل مراسي yaml ، على الأقل بالنسبة لي. انظر تعليقي أعلاه لمعرفة كيفية استخدامها.
حسنًا ، لكن من المحزن جدًا استخدام بعض الخدمات noop ، أليس كذلك؟
ما نوع القيم التي يتعامل معها هؤلاء الأشخاص؟ إذا كان الأمر يتعلق بالأسرار ، فاستخدم ميزة أسرار الأسرار (أو أي حل أسرار آخر). إذا كان الأمر يتعلق بالإعدادات ، فنحن على ما يرام في أن معظم إعدادات الوقت مخصصة للتطبيق / الخدمة ، وليس الغرض منها مشاركتها بين الخدمات.
إذا كنت بحاجة إلى مشاركة الإعدادات بين الخدمات ، فمعظم الوقت يكون هذا هو الوقت الذي تقوم فيه بتشغيل نفس صورة الحاوية ولكن لأغراض / مهام مختلفة لوقت التشغيل (المستهلك ، المنتج ، عامل http ، ...).
إذا كان الأمر يتعلق بالإعدادات ، فنحن على ما يرام في أن معظم إعدادات الوقت مخصصة للتطبيق / الخدمة ، وليس الغرض منها مشاركتها بين الخدمات.
أنا أميل إلى الاختلاف. في المشروع الذي أعمل عليه حاليًا ، أستخدمه على سبيل المثال لوحدات التخزين:
# Volume paths
environment:
- &volume_a volume-a:/usr/share/my_project/volumes/volume-a
- &volume_b volume-b:/usr/share/my_project/volumes/volume-b
- &volume_c volume-c:/usr/share/my_project/volumes/volume-c
- &volume_d volume-d:/usr/share/my_project/volumes/volume-d
يمكنني الآن تحديد هذه الأحجام من هذا القبيل:
volumes:
- volume-a:
- volume-b:
- volume-c:
- volume-d:
services:
some-service:
image: some-image
volumes:
- *volume_a
- *volume_b
some-other-service:
image: some-other-image
volumes:
- *volume_b
- *volume_c
some-third-service:
image: yet-another-image
volumes:
- *volume_a
- *volume_b
- *volume_c
- *volume_d
هذا يجعل من السهل التنقل بين وحدات التخزين المختلفة دون الحاجة إلى التفكير في الحاوية التي تكون فيها. Imho ، هذه طريقة واحدة لجعل إعداد Docker-compose أكثر اتساقًا وأسهل في الاستخدام والصيانة.
حسنًا ، نعم أفهم JanNash ولكن في
لكن المراسي ليست كافية للعديد من الحالات.
تتضمن حالتي دعم العديد من البيئات لنفس المشروع. يمكنك أن ترى سقالات لمشاريعنا هنا .
عند التطوير ، تستخدم devel.yaml
، لكن في الإنتاج تستخدم prod.yaml
. هناك أيضًا test.yaml
. كل منهم يرث من common.yaml
ويحصل على بعض المتغيرات الشائعة من ملف .env
.
كل واحد له خصائصه الخاصة:
يسمح هذا الفصل البسيط بالحصول على خط أنابيب DevOps رشيق ومرن للغاية ، حيث يستخدم الجميع نفس الكود بين المراحل المختلفة ، مع القليل من التعديلات اعتمادًا على البيئة المستخدمة.
حاولت الانتقال إلى إنشاء تنسيق ملف v3 ، ولكن ليس فقط عند الاختيار بين Swarm و DRY ، اخترنا DRY في الوقت الحالي ، لكن في يوم من الأيام سنحتاج إلى Swarm وآمل أن يتم دعم كلتا الميزتين مرة أخرى في ذلك اليوم ... ☺️extends
غير مدعوم ، ولكن أيضًا .env
، لذلك في الوقت الحالي سيكون كابوسًا للصيانة (أكثر بسبب نقص .env
، أن نكون صادقين).
... أو على الأقل لدينا طريقة لإنشاء تنسيق صالح بدون جفاف من حل DRY-ful. اعتقدت أن docker-compose bundle
كان لذلك ، ولكن يبدو أنه محكوم عليه بالإهمال الآن ...
... أو لدينا أداة مختلفة تصنع كل شيء (أنا أراقب الحاوية غير المرغوبة أيضًا). لكن بالتأكيد هذا ليس "الإصلاح".
يشتمل الرابط الموجود في https://github.com/moby/moby/issues/31101#issuecomment -301212524 على README مع مثال عملي لمثبتات YAML. بالنظر إليها وتجربتها مرة أخرى اليوم ، فإنها تعمل بشكل جيد. لست متأكدًا مما أفعله بشكل مختلف.
تضمين التغريدة
Yajo أسمعك وكما قيل ، إنه حل بديل وسيكون من الأفضل بترتيب من حيث الحجم إذا كان هناك حل جيد مدمج وجاف يتم توفيره بواسطة docker / moby / docker-compose (أيًا كان المرجع الصحيح) . دعونا نأمل جميعًا أن يأتي ذلك قريبًا لأنه بصرف النظر عن ذلك ، أنا سعيد جدًا بتأليف عامل الميناء 👍
~ من أجل فقدان دعم .env ، قمت أيضًا باختراق حل بديل (مشروعي ليس قيد الإنتاج بعد ، لذا فإن حديثي رخيص بعض الشيء ، أعرف :)). لدعم مجموعات مختلفة من متغيرات البيئة (التبعية وإصدارات / علامات الصور ، على سبيل المثال) في بيئات مختلفة (بالنسبة لي الآن ، هذا تطوير محلي وخادم تطوير صغير) ، أستخدم ملفين ، local.env
و development.env
وبدلاً من تشغيل أوامري من خلال docker-compose <command>
، إما أن أصدر ملف .env المعني في قشرتي من قبل ، أو أشغّله على النحو التالي: (. local.env && docker-compose <command>)
. لا يزال اختراقًا ، لكن في الوقت الحالي ، أنا سعيد جدًا بهذا
أتمنى لك واحدًا لطيفًا ، أنتم جميعًا 🚶
ربما حتى اثنين من حيث الحجم: د
تضمين التغريدة هل .env
غير مدعوم في 3
؟
لا أعرف في الواقع ، لقد قرأت للتو في تعليق أنه لم يكن كذلك.
لقد كنت أستخدم إجراء local.env و development.env بشكل أساسي لأنني لم أكن أعرف شيئًا عن autoenv عندما قمت بتطبيقه: D
آسف للارتباك المحتمل.
آه، ذكرYajo المفقودين .env الدعم في هذا التعليق .
هل يمكن أن توضح ،Yajo؟
أوه آسف خطأي. لا يعني ذلك أنه لا يعمل ، إنه فقط يجب عليك
هل المناقشة لإسقاط extends
أي مكان؟ أرغب في قراءتها قبل تقديم حالة الاستخدام الخاصة بنا لأنني أعتقد أنه من المفهوم جيدًا أنها كانت ميزة مستخدمة بشكل جيد.
مرحبا لدي سؤال واحد - متى؟ متى "يمتد" الدعم سوف يعود في v3؟
JanNash يمكنك الحصول على طريقة أصغر فائقة من ذلك. لقد قدمت للتو مشكلة في github ضد الريبو الخاص بك ، لقد حصلت على noop وصولاً إلى 1200 بايت من 750 كيلو بايت على جهازي.
أرى أنه لا يمكنني استخدام التمديد في الوقت الحالي في سرب.
هل لديك أية أفكار حول كيفية تشغيل نفس الخدمة بنفس منافذ النشر ، وبحاوية واحدة على الخدمة بها متغير بيئة إضافي واحد؟
+1 لتوسيع الدعم في نشر مكدس السرب
أهلا،
نحن نقوم بتشغيل تطبيق الخدمات المصغرة المنتشر في مستودعات git المتعددة (كل واحد يحتوي على ملف docker-compose الخاص به).
تتم عملية النشر بواسطة ملف إنشاء عامل ميناء "جذر" يقوم بتوسيع كل خدمة: بالنسبة لنا هذه الميزة extends
مطلوبة بالفعل لنشر المكدس.
لذا +1 أيضًا لتوسيع الدعم في نشر مكدس السرب
شكرا.
يمكنك استخدام توريث YAML البسيط (انظر &default
، <<: *default
) كحل مؤقت:
version: '3'
services:
worker: &default
build: .
command: bundle exec rake jobs:work
env_file:
- .env
volumes:
- .:/app
depends_on:
- db
- redis
links:
- db:postgres
web:
<<: *default
command: bundle exec puma -C config/puma.rb -p 3000
ports:
- "3000:3000"
spring:
<<: *default
command: bundle exec spring server
بالطبع ، ميزة extends
أفضل
ماذا عن عندما تقوم بتمديد ملف مختلف؟
لا يحتوي Yaml على خاصية تمديد الملف :(
هل هناك أي تحديث لهذه الميزة من أحد المساهمين في Docker؟ هل هذا مخطط لإعادة تقديمه؟ إذا لم يكن كذلك ، فهل هناك خطط لشيء مماثل؟ إذا لم يكن كذلك ، فلماذا لا ..؟
quolpr ، أخشى أن رمز "YAML simple وراثة" لا يحل محل extends
في معظم الحالات لأن "النموذج الأولي" (على سبيل المثال &default
) سيتم تفسيره دائمًا بواسطة Docker Compose خدمة تسمى worker
. أي خدمة أ) تحتاج إلى تعريف جيد ، ب) قد تكون غير مرغوب فيها.
على أي حال ، بالتأكيد ميزة مثيرة للاهتمام.
laugimethods ، يمكنك أيضًا استخدام مراجع YAML:
version: '3'
services:
spring:
build: ./app
command: /bin/sh -c "bundle exec spring server"
volumes: &default_volumes
- ./app:/app:delegated
- bundle:/bundle:nocopy
worker:
build: ./app
command: bundle exec sidekiq -v -C config/sidekiq.yml
volumes: *default_volumes
(انتبه إلى &default_volumes
و *default_volumes
)
لكنني حقًا لا أستطيع أن أفهم سبب إزالة ميزة extends
🤔
لمعلوماتك ، لاستبدال ميزة "extends" المفقودة ، أستخدم الآن تكوينًا / دمج ملفات .yaml
:
https://github.com/Logimethods/smart-meter/blob/master/README.md#docker -compose
يمتد الأعمال ، ببساطة وناضجة ، أعتقد أنه إذا رأى شخص ما الامتدادات على أنها بعض النمط المضاد ، فلا تستخدم ذلك ، ولكن من فضلك لا تقطعه
هل لي أن أطلب شرحًا واضحًا للنهج المقصود دون استخدام extends
؟ أنا أستخدمه على نطاق واسع ، لا سيما عند الوراثة من الملفات الموجودة في وحدات Git الفرعية ، مما يسمح بتعريف مشروع ميتا يتعامل مع الأسلاك الشبكية عبر التطبيقات ، وما إلى ذلك. على الرغم من أنني أدرك جيدًا أنه يمكنني تحديد عدة ملفات docker-compose.yml
و هل تم تجاوزها ، فهل هذا يعني أنني سأحتاج إلى تحديد الترابطات في سطر الأوامر ، بدلاً من التمكن من فحصها في التحكم بالمصادر باستخدام extends
؟ أو هل فاتني بعض الميزات الجديدة في مكان ما في الإصدار 3؟
أنا أستخدم extends
بكثافة في مشاريع متعددة لتوريث مجموعة مشتركة من سمات الخدمة لبيئة مختلفة ومضيفين مختلفين (اقرأ: أستخدم extends
للوراثة من ملف مختلف).
بعد أن قرأت في ذهول إزالة الكلمة الرئيسية extends
ومحاولة العثور على بديل لا يتطلب تسلسل أقحوان -f
docker يؤلف الملفات ، أشعر بالفضول الشديد ما هو سبب إزالة extends
.
أتفهم مشكلة links
و volume-from
ولكن مجرد الامتناع عن استخدامها في ملفات yml الأساسية يبدو أن أفضل شيء يمكن فعله.
سيكون من غير المحتمل إزالة عجلة السيارة لمجرد أنها _ربما _ تعتاد على قلب السيارة رأسًا على عقب ... أليس كذلك؟
ملاحظة: تبدو noop and anchors مثيرة للاهتمام ولكنها تضيف تعقيدًا غير ضروري إلى أبسط المشاريع ...
كمثال بسيط للغاية:
common/common.yml
services:
web:
image: alpine:3.6
build: .
environment:
DOMAIN:
PREFIX:
dev/docker-compose.yml
services:
web:
extends: ../common/common.yml
service: web
ports:
- "8080:8080"
prod/docker-compose.yml
services:
web:
extends: ../common/common.yml
service: web
image: the-prod-image:latest-release
ports:
- "80:80"
- "80:443"
environment:
NEW_RELIC_KEY:
فقط كيف تحافظ على مبادئ جاف دون extends
؟
لا أرى حاليًا أي سبب للترقية من الإصدار 2.1 بسبب ذلك.
teodorescuserban ،
تسلسل أقحوان - f docker يؤلف الملفات
ما المشكلة في ذلك؟ يمكنك إنشاء البرامج النصية الخاصة بك بأسماء مستعارة قصيرة للاتصال بـ docker-compose.
استخدم الهيكل التالي:
services:
web:
image: alpine:3.6
build: .
environment:
DOMAIN:
PREFIX:
services:
web:
ports:
- "8080:8080"
services:
web:
image: the-prod-image:latest-release
ports:
- "80:80"
- "80:443"
environment:
NEW_RELIC_KEY:
docker-compose -f common/common.yml -f dev/docker-compose.yml -p myproject up --build
docker-compose -f common/common.yml -f prod/docker-compose.yml -p myproject up --build
لم أكن أعرف هذه الميزة. على الرغم من أنه يجعل CLI الخاص بك 💩 ، إلا أنه يمكن أن يعمل.
أعتقد أنه إذا كان هذا سيكون البديل الرسمي لـ extends
، فيجب أن تكون هناك طريقة لتسهيل الأمر.
على سبيل المثال:
عامل ميناء compose.yml
version: "3" # or whatever
extend:
- ./common/common.yml
- ./dev/docker-compose.yml
services: # Not required now
# etc.
بهذه الطريقة يمكنك الإشارة إلى ملف واحد docker-compose.yml
يقوم بكل ما تحتاجه.
قد يكون البديل المفيد هو دعم ملفات تكوين متعددة في COMPOSE_FILE
env var.
تضمين التغريدة
قد يكون البديل المفيد هو دعم ملفات تكوين متعددة في COMPOSE_FILE env var.
من https://docs.docker.com/compose/reference/envvars/#compose_file :
يدعم هذا المتغير عدة ملفات إنشاء مفصولة بفاصل مسار (في Linux و macOS ، يكون فاصل المسار هو
:
، وفي Windows يكون;
). على سبيل المثال:COMPOSE_FILE=docker-compose.yml:docker-compose.prod.yml
. يمكن أيضًا تخصيص فاصل المسار باستخدامCOMPOSE_PATH_SEPARATOR
.
@ dermeister0 يمكنك أيضًا دمج هذه الملفات بشكل دائم باستخدام أدوات مثل https://github.com/ImmobilienScout24/yamlreader :
> yamlreader common/common.yml prod/docker-compose.yml > docker-compose-prod.yml
> docker-compose -f docker-compose-prod.yml -p myproject up --build
> cat docker-compose-prod.yml
services:
web:
build: .
environment:
DOMAIN: null
NEW_RELIC_KEY: null
PREFIX: null
image: the-prod-image:latest-release
ports:
- 80:80
- 80:443
@ dermeister0 أشكرك على اقتراحك للأسف إنه طريقة صعبة للخروج منه. باستخدام extends
أزل الحاجة لمعرفة بالضبط كيف تحتاج إلى سلسلة ديزي. بينما يمكنني التعايش مع القيام بذلك بنفسي ، لا يمكنني أبدًا تطبيق هذا الحل على مطوري الأعزاء.
ومع ذلك ، لم أكن أدرك أن المتغير env COMPOSE_FILE
يمكن أن يحتوي على قيم متعددة. شكرا لك gsong ! هذا رائع ويمكن استخدامه (أنا أحدده في ملف .env
). توجد مشكلة واحدة هنا: في الملفات الأساسية / الشائعة ، قد يكون لدي أيضًا بعض الخدمات التي لا أحتاجها.
خذ على سبيل المثال ملفًا مشتركًا ثابتًا يحدد قاعدة البيانات وحاويات الويب. عند التدريج ، تريد تجميعها جميعًا معًا ولكن في prod قد ترغب في مضيفين منفصلين لـ db والويب.
أيضًا ، يتم تحميل docker-compose.override.yml افتراضيًا.
https://docs.docker.com/compose/extends/#understanding -multiple-compose-files
أستخدم هذا الأسلوب مع الإصدار 3.3:
docker-compose.yml
؛docker-compose.override.yml
لتكوين تطوير وخدمات معينة (مثل xdebug على سبيل المثال) ؛docker-compose.staging.yml
لخيارات تكوين التدريج المحددة.ملاحظة: لا أقوم بتشغيل Docker في الإنتاج.
باستخدام هذا الأسلوب يمكنني بسهولة الإنشاء محليًا باستخدام docker-compose build
وعندما أنشر على التدريج أستخدم:
docker-compose -f docker-compose.staging.yml -f docker-compose.yml build
أنا أستخدم Apache ، وليس لدي ملفات مضيفة افتراضية منفصلة للتطوير والتشغيل المرحلي. لقد قضيت وقتًا طويلاً لتجنب وجود ملفات مختلفة. في النهاية ، رأيت أن الأسلوب الوحيد الصالح هو استخدام <IfDefine>
ومتغيرات البيئة (التي قمت بتعيينها في قسم البيئة لملفات yml) ، لتضمين تكوين ssl على سبيل المثال. وأنا أستخدم TLD وبادئة المجال ، لذا يمكنني الحصول على شيء مثل www.example.local http: //www.example.local/ : 8080 و www.staging.example.com http://www.staging.example.com / . محليًا ، تعمل مواقع الويب تحت http وعلى التدريج على https. باستخدام هذا الأسلوب ، لا يتعين علي الاحتفاظ بإصدارات مختلفة من الملفات. أعتقد أنه يمكن فعل الشيء نفسه في الإنتاج ، لكن كما قلت ، أفضل تجنب Docker في الإنتاج ، أجهزة الصراف الآلي.
المسارات كلها أقارب ، لذلك ستعمل الحاويات في أي بيئة.
2 سنتي
-فيليبو
في حالتي ، استخدمت سابقًا شيئًا كهذا:
بفضل https://github.com/moby/moby/issues/31101#issuecomment -329482917 و https://github.com/moby/moby/issues/31101#issuecomment -329512231 ، والتي لم أكن أعرف عنها ، يمكنني الآن الانتقال إلى الإصدار 3 باستخدام مخطط مختلف:
يمكنني أيضًا القيام بأي عمليات اختراق لازمة باستخدام المتغير env ، لذلك في حالتي تم إصلاح المشكلة. شكرا! 🎉 (آسف ، كان يجب أن أقرأ المستندات الجديدة بشكل صحيح قبل تقديم الشكوى).
ملاحظة: مع ذلك ، سيكون من الجيد استرجاع extends
، لكن على الأقل لدينا بديل عادل بما فيه الكفاية. 😊
@ shin- في البداية شعرت بخيبة أمل كبيرة لرؤية ميزة extends
مفقودة في 3.0
، لكن مذيعي YAML (مثال: https://github.com/JanNash/docker-noop) سيكون أكثر من بديل كاف.
الشيء الوحيد هو أنه ، كما في المثال أعلاه ، تحتاج إلى وضع نقاط الارتساء الخاصة بك في قسم صالح من ملف docker-compose.yml
.
هل يمكننا الحصول على خاصية (المستوى الأعلى) templates
أو مفاتيح مخفية كما هو الحال في GitLab لتكون أكثر مرونة في طريقة تحديد
@ schmunk42 ألق نظرة على https://github.com/docker/cli/pull/452
تكمن مشكلة الاعتماد على docker-compose.override.yml في أنه يفترض مسبقًا أن لديك نوعًا واحدًا فقط من التجاوزات التي تحتاج إلى تضمينها وطبقة واحدة من التجاوزات.
في حالتي ، أريد أن يكون لدي بعض السلوكيات المشتركة لجميع التطويرات المحلية ، ولكن قد أحتاج إليها أن تكون مختلفة بمهارة إذا كان المطور يعمل بنظام Windows أو OSX أو Linux. للحفاظ على هذا الأمر قابلاً للإدارة في سياق v3 docker-compose ، لدي مستخدمي Linux يعملون على نفس السلوك مثل بيئة التدريج ، والتي تعمل ولكنها تعني أنهم بعيدون قليلاً عن المطورين الآخرين.
أتجنب استخدام -f
للتنمية المحلية لأنني وجدت أنه عرضة جدًا للخطأ البشري ، والاعتماد عليه كبديل للعديد من الأشياء يسبب مشاكل. اختيار ملف واحد يبدو معقولًا ، واختيار متعدد شيء أتجنب فرضه بعناية.
لمعلوماتك، أعتقد أنه بمجرد أن الإختراق مع x-
المذكورة أعلاه، وكذلك تسلسل ديزي ملفات عامل ميناء يؤلف باستخدام COMPOSE_FILE
متغير في .env
ملف المشروع، إضافة docker- يجب أن يحل compose.override.yml كل حالة استخدام واجهتها حتى الآن.
المراسي yml هي أيضًا شيء أنيق أنوي استخدامه في المستقبل القريب.
لست سعيدًا جدًا بجمال الاختراق x-
ولكن يمكنني التعايش مع ذلك.
شكرا يا رفاق لالمدخلات الخاصة بك!
يبدو أن إزالة extends
يسبب الكثير من الحموضة المعوية وإما منع الانتقال إلى الإصدار v3 أو اللجوء إلى الاختراقات. أحب القدرة على تحديد خدمة "نموذج" (أو مجردة) يمكنها أن تحمل بعض الأشياء الشائعة (مثل سياسات التحديث)
أنا أعمل على أداة تصفية golang بسيطة يمكنها معالجة ملف إنشاء عامل ميناء باستخدام extends
وإخراج ملف نظيف v3 مع حل الامتدادات:
تصميم العزم
(or docker-compose up)
هل سيعمل هذا على الأقل على بعض حالات الاستخدام الخاصة بك / لماذا مسكنا؟
pnickolov سيكون ذلك رائعًا بالنسبة لي.
لقد كنت أبحث عن حاوية غير مرئية (أستخدمها بشكل شخصي ، ولكني لم أعمل بعد) ، والتي يبدو أنها ستفعل كل ما أحتاجه ، لكن نصًا مثل نصك سيكون أكثر تفضيلًا (أقل إزعاجًا)
طالما أنه يمكنه معالجة المفاتيح extends:
بشكل متكرر ، فسأكون سعيدًا!
حسنًا ، يبدو أننا وجدنا بدائل لـ extends
... 👍
الأمر المقلق هو حقيقة أن Moby's Project Management لا يبدو أنها تفكر في الحفاظ على التوافق كعنصر أساسي. يعد التوافق الأمامي أمرًا ضروريًا للتبني على نطاق أوسع ، خاصة للتطبيقات الكبيرة التي يتم نشرها في الإنتاج. كيف يمكننا الضغط من أجل Docker Swarm / Docker EE عندما لا يوجد ضمان بأن الميزات الأساسية مثل extends
ستبقى؟ 👎
من الصعب كسب السمعة الطيبة ومن السهل خسارتها ...
أنا شخصياً أفضل الاعتماد على ميزات YAML الأصلية لإنجاز المهمة التي تتم معالجتها بواسطة بناء جملة extends
في صيغة v2
، بدلاً من نص مخصص أو حل أكبر مثل غير مرغوب فيه. كنت أواجه مشكلات مماثلة في وقت سابق وبدأت في كتابة المحول الخاص بي قبل أن يكون هناك حل مثل استخدام ملفات .yml متعددة وما إلى ذلك. (https://github.com/schmunk42/yii2-yaml-converter-command) - لكن لم يكن حل قابل للتطبيق.
بالنسبة لي ، من الجيد أيضًا إهمال الميزات ، إذا تم ذلك جنبًا إلى جنب مع سياسة الإصدار ؛ لا يمكنك حمل الأشياء القديمة إلى الأبد ، حتى لو كان هذا يعني بعض العمل من جانبنا.
@ schmunk42 يعد إهمال الميزات
للأسف ، لا ينطبق أي من هذه المتطلبات (في كتابي) على إيقاف العمل بـ extends
...
laugimethods ما سبب احتياجك لاستخدام v3
؟
@ schmunk42 بسبب سرب:
تم تصميم الإصدار 3.x ، الإصدار الأحدث والموصى به ، ليكون متوافقًا بين وضع التأليف ووضع سرب محرك Docker. هذا محدد بإصدار: "3" أو إصدار: "3.1" ، إلخ ، الإدخال في جذر YAML.
يدعم أمر Docker stack publishing أي ملف Compose من الإصدار “3.0” أو أعلى
راجع للشغل ، تعليقي لا يتعلق فقط بـ extends
، ولكن بأي إهمال (مؤلم) قد يحدث في المستقبل ...
نعم ، نحن نواجه نفس المشكلة بسبب وضع السرب.
سألت نفسي في المقام الأول ، لماذا بحق الجحيم يمكن لـ Docker CLI الآن استخدام إدخال --composer-file
. ولكن من تعلمنا باستخدام docker/swarm
، يبدو الأمر معقدًا جدًا لتشغيل مكدسات على سرب (ذاتي الإدارة) وأن هناك عدة أسباب وجيهة لنقل هذا إلى المحرك.
فقط لألاحظ بعض النتائج التي توصلت إليها هنا ... الانتقال من v2
إلى v3.4
بعيدًا عن أن يكون سهلاً.
بعض مشاكلي:
volumes_from
، يسهل التحايل عليها ، لأننا أردنا إزالتها على أي حال.env
(مثل ملفات docker-compose
) ليس لها تأثير مع Docker CLIdocker stack deploy -c docker-compose.yml -c docker-compose.override.yml doro
) لا يعمل بشكل صحيح ، ولا يوجد خطأ ، ولكن يبدو لي أنه لم يتم دمجها بشكل صحيح - ولكن لا يوجد أمر مثل docker-compose config
للتحقق من ذلكdocker-compose
والذي يدعم بناء الجملة v3.4
؛ مثل Docker edge--scope swarm
CC:handcode
باستخدام أحدث البنيات
أنا الآن أستخدم خط أنابيب التكوين هذا لاستبدال استخدامي لـ _extend_ و _ noop_
يحافظ على الأشياء أكثر جفافاً
أمل أن هذا يساعد شخصاما
base.yml (تعريفات مشتركة ، هذا مستند yaml صالح ، لذا قابل للدمج باستخدام _docker-compose config_)
version: '3.4'
networks:
net_back:
external: true
base-injection.yml (تعريفات الربط المشتركة ، للأسف لا يمكن إضافتها إلى base.yml حيث لا يمكن الإشارة إلى الارتساءات عبر ملفات yaml المختلفة ، بدلاً من ذلك يتم إدخالها كنص في foo.yml ، وهي ليست طريقة مثالية للقيام بذلك)
x-logging: &logging
driver: json-file
options:
max-size: "50m"
max-file: "2"
foo.yml (عام تعريف المكدس، مراجع الكائنات من base.yml، المراسي من قاعدة inject.yml والكائنات تجاوز في فو dev.yml)
version: '3.4'
[[base-inject]]
services:
foo:
image: ${DOCKER_REGISTRY}/foo:${IMAGE_VERSION}
volumes:
- type: volume
source: "volfoo"
target: "/foo"
networks:
- net_back
logging:
<<: *logging
foo-dev.yml (حسب تعريف مكدس البيئة)
version: '3.4'
services:
foo:
ports:
- "8080:80"
volumes:
volfoo:
name: '{{index .Service.Labels "com.docker.stack.namespace"}}_volfoo_{{.Task.Slot}}'
driver: local
ثم أمر النشر:
docker stack rm stack_foo && echo "waiting..." && sleep 3 &&
cat foo.yml | sed -e '/base-inject/ {' -e 'r base-inject.yml' -e 'd' -e '}' > ./foo-temp1.yml &&
export $(sed '/^#/d' ./dev.env | xargs) &&
docker-compose -f base.yml -f ./foo-temp1.yml -f foo-dev.yml config > ./foo-temp2.yml
docker stack deploy --with-registry-auth --prune --compose-file ./foo-temp2.yml stack_foo
بالنسبة لأولئك الذين يتوقون إلى ما بعد extends
في إنشاء أكثر من 3 ملفات ، فقد وضعت يدي للتو على أداة تسمى baclin
. baclin
بوضع هذه التوجيهات بشكل خطي ، مع استبدال جميع توجيهات extends
بشكل متكرر بمحتواها. هذا هو برنامج ألفا ، الكود هو جزء من أجهزتي حيث أقوم حاليًا بكتابة التعليمات البرمجية لدعم وضع Swarm ونشر المكدسات. ثنائيات النظام الأساسي لإصدار مبكر من baclin
متوفرة هنا . الرجاء الإبلاغ عن أي تعليق أو قضية هنا .
هذا حقا محير!
يجب أن تكون هذه الميزة متاحة عند قراءة مستند الإصدار الأخير من عامل الإرساء ( v17.09
) وأيضًا مستند الإصدار v17.06
.
$ head -n1 docker-compose.yml
version: '3'
لكن عوائد compose up
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.admin_application: 'extends'
عند استخدام الكلمة الأساسية extends
.
أيضًا ، لا يمكنني العثور على أي شيء حول إزالة extends
في سجل التغيير compose
.
الآن ما هو ؟!
لا ينبغي أن يكون من الصعب العثور على معلومات حاسمة مثل هذه أو إخفاؤها داخل بعض مشكلات جيثب الغامضة.
$ docker --version
Docker version 17.09.0-ce, build afdb6d4
$ docker-compose --version
docker-compose version 1.16.1, build 6d1ac21
jottr ، راجع المستندات :
يتم دعم الكلمة الأساسية الموسعة في تنسيقات ملفات Compose السابقة حتى إصدار ملف Compose 2.1 (انظر يمتد في v1 ويمتد في v2) ، ولكن لا يتم دعمه في إنشاء الإصدار 3.x.
لذلك إذا كنت تريد استخدام extends
فأنت بحاجة إلى استخدام version: '2.1'
.
خطأي. يجب أن يظل في أعلى المستند بعلامة تحذير حمراء للإيقاف.
خطأي. يجب أن يظل في أعلى المستند بعلامة تحذير حمراء للإيقاف.
jottr فقط استخدم Github لإنشاء مشكلة منفصلة لذلك أو حتى إنشاء https://github.com/docker/docker.github.io/issues/5340
في حالتي ، لدي docker-compose-override.yml
النحو التالي:
yaml
version: "3.4"
services:
common:
extra_hosts:
- "host1:172.28.5.1"
- "host2172.28.5.2"
- "host3:172.28.5.3"
networks:
default:
external:
name: "common-network"
ولدي العديد من ملفات docker-compose.yml
التي تحتاج إلى مشاركة الشبكة والمضيفات الإضافية. كيفية القيام بذلك باستخدام ميزة الامتداد بدون؟
yaml
version: "3.4"
services:
mongo:
image: "mongo"
container_name: "mongo"
hostname: "mongo"
volumes:
- "/opt/docker/mongo/default.conf:/usr/local/etc/mongo/mongod.conf"
- /opt/data/mongo:/data/db"
ports:
- "27017:27017"
command: "mongod --config /usr/local/etc/mongo/mongod.conf"
networks:
default:
ipv4_address: "172.28.5.4"
سيكون من الرائع إذا كان عامل الإرساء يؤلف مرساة yaml والمراجع بين الملفات المختلفة. ربما ، تطبيق المرساة والمراجع بعد دمج الملفات.
على سبيل المثال:
yaml
version: "3.4"
services:
common: &common
extra_hosts:
...
networks:
...
yaml
version: "3.4"
services:
mongo:
<<: *common
image: "mongo"
container_name: "mongo"
...
يجب أن تكون النتيجة:
yaml
version: "3.4"
services:
mongo:
image: "mongo"
container_name: "mongo"
extra_hosts:
// EXTRA HOSTS HERE
networks:
...
@ sandro-csimas هذا ممكن مع: https://docs.docker.com/compose/compose-file/#extension -fields
@ shin- هل يمكن إغلاق هذه التذكرة؟
rdxmb لا أعتقد ذلك. مما يمكنني رؤيته ، لا يمكنك التمديد من ملف إنشاء عامل ميناء آخر
هل أنا محق في التفكير في أن هذه مشكلة لـ https://github.com/docker/compose/issues ؟
بعض التصحيح:
# cat docker-compose.yml
version: "3.4"
services:
foo-not-bar:
<< : *common
foo-bar:
<< : *common
environment:
- FOO=BAR
x-common-definitions-for-all-our-services:
&common
image: phusion/baseimage
environment:
- FOO=NOTBARBYDEFAULT
هذا العمل مع
docker stack deploy -c docker-compose.yml test
عند استخدام عامل البناء:
# docker-compose up
ERROR: yaml.composer.ComposerError: found undefined alias 'common'
in "./docker-compose.yml", line 4, column 10
تغيير ملف yml إلى:
version: "3.4"
x-common-definitions-for-all-our-services:
&common
image: phusion/baseimage
environment:
- FOO=NOTBARBYDEFAULT
services:
foo-not-bar:
<< : *common
foo-bar:
<< : *common
environment:
- FOO=BAR
يعمل أيضًا مع عامل البناء.
لذلك اعتقدت أن هذا يجب أن يعمل أيضًا مع ملفات متعددة ، وهذا ليس هو الحال:
# docker-compose -f compose-services.yml -f compose-default.yml config > docker-compose.yml
ERROR: yaml.composer.ComposerError: found undefined alias 'common'
in "./compose-services.yml", line 5, column 10
t# docker-compose -f compose-default.yml -f compose-services.yml config > docker-compose.yml
ERROR: yaml.composer.ComposerError: found undefined alias 'common'
in "./compose-services.yml", line 5, column 10
# cat compose-services.yml
version: "3.4"
services:
foo-not-bar:
<< : *common
foo-bar:
<< : *common
environment:
- FOO=BAR
# cat compose-default.yml
x-common-definitions-for-all-our-services:
&common
image: phusion/baseimage
environment:
- FOO=NOTBARBYDEFAULT
ومع ذلك ، بالطبع ، يمكن دمج هذا باستخدام بسيط cat
:
# cat compose-default.yml compose-services.yml > docker-compose.yml && docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use `docker stack deploy`.
Creating network "test_default" with the default driver
Creating test_foo-bar_1 ...
Creating test_foo-not-bar_1 ...
Creating test_foo-bar_1
Creating test_foo-bar_1 ... done
يعمل على xenial بالإصدارات:
# docker --version
Docker version 17.11.0-ce, build 1caf76c
# docker-compose --version
docker-compose version 1.17.0, build ac53b73
@ rdxmb ، شكرا!
لذلك يجب أن أذهب لدمج ملفات الإنشاء باستخدام الأمر "cat" وتنفيذ الملف النهائي.
أستخدم أيضًا docker-compose config
للقيام بذلك. مثال للإعدادات الخاصة بالبيئة:
يتم تشغيل هذا بواسطة خط أنابيب CI: docker-compose -f docker-compose.yml -f docker-compose.override.prod.yml config > docker-compose.prod.yml
ثم أستخدم docker stack deploy -c .\docker-compose.prod.yml my-stack
التصويت لهذا ، الامتدادات مفيدة جدا ل v3.
استخدمته كثيرًا مع الإصدار 2 ، وهو مفيد جدًا بالفعل!
+1
أرغب في رؤية دعم extends
في الإصدار 3. سيساعد ذلك في تجفيف ملف docker-compose.yml
كثيرًا.
لقد مر ما يقرب من عام منذ طرح هذه المشكلة ومن الواضح حقًا أن الكثير من الأشخاص يحتاجون إلى هذه الميزة. ومع ذلك ، لم أقرأ استجابة مطور Docker لهذا الطلب على الإطلاق ، ولا تفسيرًا لسبب عدم تضمينه في docker-compose v3 قبل الإصدار.
حالة محزنة للبرامج إذا لم نتمكن حتى من التواصل أو الحفاظ على ميزات لعملائنا الذين يؤمنون بتكنولوجيا جديدة.
أحد التفسيرات المحتملة (وربما أيضًا ملخصًا للموضوع الحالي) للموقف هو كما يلي:
cat
البسيط والطريقة المتقدمة في هذا الموضوع. يُظهر تعليق النهج البسيط مشكلة إنشاء عامل ميناء تحميل ملفات متعددة في النهاية (هل أنشأ أي شخص مشكلة لذلك؟). إذا تم إصلاح ذلك في docker-compose ، فلن تحتاج حتى إلى دمج الملف على الإطلاق. لذلك بالنسبة لي ، يجب على الأشخاص الراغبين في دعم متعدد الملفات الاستمرار في عامل الإرساء / الإنشاء / المشكلات كما اقترح rdxmb .extends
(راجع أحداث مشروع GitHub ، شفافية لطيفة هنا من فريق Docker ، شكرًا!) وقد تفسر النتيجة على أنها "هناك الكثير من الأشياء الأخرى الأكثر أهمية من الناحية الإستراتيجية بالنسبة لهم" ولكن يمكنك لا يزال يكتب طلب سحب extends
ما أظن.بالنسبة لي ، هذه وجهة نظر مفهومة تمامًا.
تضمين التغريدة
IMHO ، على الرغم من أن الأساليب التي ذكرها aCandidMind تعمل ، إلا أنها تضيف تعقيدًا إلى آلية أبسط وأنظف يوفرها extends
.
ربما يكون هذا أنا ، لكن نقل تكوين معقد إلى حد ما يؤدي إلى توسيع التكوين إلى حقول الامتداد يصبح من الصعب قراءته وصيانته.
بعد قراءة العديد من التعليقات والمنشورات ، لا يزال من غير الواضح بالنسبة لي سبب إسقاط الامتدادات وما هي مزايا هذا التراجع في القدرات.
من الممكن مع القليل من سحر bash أن أضع ريبوًا تجريبيًا حتى تتمكن من تجربته بنفسك.
ما عليك سوى إنشاء أمر stack deploy
النحو التالي:
docker stack deploy --compose-file=<(docker-compose -f docker/prod.yml -f docker/dev.yml config) <stackname>
tylerbuchea - الجانب السلبي الوحيد لهذا السحر هو أنك قد تحصل على WARNING: Some services (<service-name(s)>) use the '<key>' key, which will be ignored. Compose does not support '<key>' configuration
. هذا يمكن أن يسبب بعض الالتباس. لكن مهلا ، إنه يعمل 👍
dnmgns أنت على حق! شكرا لتوضيح ذلك. مثل joaocc قال لا شيء سيتغلب على الدعم المحلي ، لكن الحل الذي ذكرته أعلاه هو أفضل حل يمكن أن أجده نظرًا لعدم وجود تبعيات أخرى غير bash.
tylerbuchea إحدى الطرق القذرة هي إعادة توجيه stderr إلى / dev / null :)
docker stack deploy --compose-file=<(docker-compose -f docker/prod.yml -f docker/dev.yml config 2> /dev/null) <stackname>
لا عيب فيه 😄
أعتقد أن الوثائق يجب أن تكون أكثر وضوحًا حول هذا الالتباس حول extend
.
يعيد وصف extend
توجيه المستخدم إلى مستندات "كيفية الترقية" ، ويعيد "محرر مستندات كيفية الترقية" الرجوع إلى الوصف الخاص بـ extend
للحصول على مزيد من المعلومات. هذا ليس مفيدًا بدرجة كافية: بصفتي مستخدمًا ، أتوقع بعض المساعدة في كيفية التعامل مع هذه المشكلة برمتها ، وما هي الخيارات المتاحة أمامي وما الذي يجب أن أفكر فيه. أنا متأكد جدًا من وجود فكرة واضحة وراء قرار إزالة extend
من الإصدار 3.
ارى:
https://docs.docker.com/compose/extends/#extending -services
https://docs.docker.com/compose/compose-file/compose-versioning/#upgrading
فيما يتعلق بحلtylerbuchea الرائع
للأسف لا يدعم بعض ميزات مكدس Docker المتقدمة:
WARNING: Some services (web) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
WARNING: Some services (web) use the 'configs' key, which will be ignored. Compose does not support 'configs' configuration - use `docker stack deploy` to deploy to a swarm.
ليس هذا منذ أن تم دمج https://github.com/docker/cli/pull/569 ، بدءًا من 18.03 ، وسيدعم docker stack deploy
دمج ملفات إنشاء متعددة في ملف واحد. لا يحل محل المفتاح extends
بالكامل من تنسيق composefile v2 ولكن نأمل أن يغطي طريقة استخدام أكثر 👼
كان الحل الخاص بي هو استخدام yq
(يمكن دمجه في سطر واحد في حالة استخدام Bash):
yq merge --overwrite docker-stack.yml docker-stack.preprod.yml > merged-docker-stack.yml
docker stack deploy -c merged-docker-stack.yml preprod
@ Lucas-C إنها تحذيرات فقط من أن الناتج سيظل يتضمن مفاتيحك deploy
و config
. يمكنك التحقق من ذلك إذا قمت بتشغيل docker-compose -f docker/prod.yml -f docker/dev.yml config
إنه مخصص لإنشاء ملفات v3.4 وما بعده. وهو يدعم إشارات yaml المتقاطعة (جزئية). انتهيت من هذا البرنامج النصي zsh alias / perl:
alias regen=$'perl -MFile::Slurp=read_file -MYAML=Load,Dump -MHash::Merge::Simple=merge -E \'
local $YAML::QuoteNumericStrings = 1;
$n=read_file("/data/docker-compose.yml");
$s=Dump(merge(map{Load($n.read_file($_))}@ARGV));
local $/ = undef;
$s =~ s/\\bno\\b/"no"/g;
say $s;
\' $(find /data -mindepth 2 -maxdepth 4 -name docker-compose.yml) >! /data/x-docker-compose.yml'
regen
export COMPOSE_FILE=/data/x-docker-compose.yml
الإيجابيات : perl أداة شائعة ، جميع وحدات perl أيضًا ، الجيل سريع.
السلبيات : أكره الاختراق ولكن لا توجد طريقة أخرى لـ DRY. يتكون عامل الإرساء النهائي من حوالي 900 سطر. هل تريد حقًا أن أدعمه كملف واحد من البداية؟ إنه لأمر مخز أن يكون عامل ميناء ثنائي ملفوفًا بقطعة عامل ميناء بيثون ملفوفة بخرق بيرل.
كيف يمكنك فقط إخراج ميزة مثل الامتدادات؟ هذا يبدو وكأنه ميزة أساسية.
أدى استخدام docker-compose config
إلى خيار الإدخال القياسي docker stack deploy -c -
إلى حل المشكلة بالنسبة لي:
docker-compose -f docker-compose.yml \
-f docker-compose.extended.yml \
config \
| docker stack deploy -c - my-stack
لم أجرب هذا ، لكنني لاحظت ذلك أيضًا في وثائق docker stack deploy
:
إذا تم تقسيم التكوين الخاص بك بين ملفات تكوين متعددة ، على سبيل المثال تكوين أساسي وتجاوزات خاصة بالبيئة ، فيمكنك تقديم علامات
--compose-file
.
مع هذا كمثال:
docker stack deploy --compose-file docker-compose.yml -f docker-compose.prod.yml vossibility
https://docs.docker.com/engine/reference/commandline/stack_deploy/#compose -file
هل الأساس المنطقي لإزالة extends
موثق في مكان ما؟ لا يبدو أنه موضح في المستندات الرسمية ، على سبيل المثال هنا: https://docs.docker.com/compose/extends/#extending -services
إذا تمكن المستخدمون من فهم الأساس المنطقي ، فيمكن عندئذٍ للمستخدمين تطوير فكرة أفضل عن كيفية الرد على الإزالة. شكرا.
@ shaun-blake انتهى بي الأمر باستخدام ملفات الإنشاء المتعددة. يبدو أن هذا هو النهج الذي يستخدمه الناس. بدلاً من الميراث ، إنه أشبه بمزج. عند البناء أو التشغيل ، أنسخ قالب yaml الخاص بالبيئة الصحيحة إلى docker-compose.override.yml.
ملفات يؤلف عامل ميناء متعددة (على سبيل المثال: base.yml
، local.yml
، prod.yml
) لا يسمح باستخدام خدمة المراسي YAML من الملفات الأخرى بحيث لا يمكن تعريف تعريفات الخدمة يؤخذ من بين الملفات yml متعددة .
ملاحظة ، هذه المشكلة هي رقم 13 الأكثر تعليقًا : https://github.com/moby/moby/issues؟q=is٪3Aissue+is٪3Aopen+sort٪3Acomments-desc والثالث الأكثر إعجابًا .
إذا تمكن المستخدمون من فهم الأساس المنطقي ، فيمكن عندئذٍ للمستخدمين تطوير فكرة أفضل عن كيفية الرد على الإزالة. شكرا.
+1 على التوثيق على الأساس المنطقي لإزالة extends
في المقام الأول ...
لم يتم تمديد _ بعد مرور عام ونصف تقريبًا. Cmon ، devs ، u لا تزيل شيئًا دون إعطاء بديل.
لقد فعلوا ، لقد عرضوا بديلًا يسمى التكوين. من فضلك اقرأ إجابتي في الموضوع.
-فيليبو
في 30 يوليو 2018 ، الساعة 09:41 ، كتب Xiaohui Liu [email protected] :
لا يزال لا يمتد بعد ما يقرب من عام ونصف العام. Cmon ، devs ، u لا تزيل شيئًا دون إعطاء بديل.
-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/moby/moby/issues/31101#issuecomment-408790200 ، أو كتم صوت الموضوع https://github.com/notifications/unsubscribe-auth/AAS_0AOynjpfVnVo4ZqciMbmjksBmkcM3
dedalozzo ، "في الموضوع" ==؟
يرجى الاطلاع على تعليقي هنا:
https://github.com/moby/moby/issues/31101#issuecomment -329527600 https://github.com/moby/moby/issues/31101#issuecomment-329527600
يجب عليك في الأساس استخدام سلسلة من ملفات .yml لتجاوز أو تغيير تكوين الحاويات الخاصة بك.
الرجاء قراءة "تحديد ملفات تكوين متعددة"
يمكنك توفير ملفات تكوين متعددة. عند توفير ملفات متعددة ، يجمعها Compose في تكوين واحد. ينشئ الإنشاء التكوين بالترتيب الذي توفره للملفات. تلغي الملفات اللاحقة وتضيف إلى سابقاتها.
https://docs.docker.com/compose/reference/overview/ https://docs.docker.com/compose/reference/overview/
يستخدم هذا النهج تكوينًا على الميراث للحصول على نفس النتيجة تقريبًا.
في 30 يوليو 2018 ، الساعة 15:23 ، كتب Serban Teodorescu [email protected] :
dedalozzo https://github.com/dedalozzo "في الموضوع" ==؟
-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/moby/moby/issues/31101#issuecomment-408880809 ، أو كتم صوت سلسلة المحادثات https://github.com/notifications/unsubscribe-auth/AAS_0FZO30NplqHRid_Id8VBOJW7uM4Diga .
ألن نكون قادرين على استعادة نفس القابلية للتمديد إذا قمنا بدمجها
حقول ملحق yaml (تكوين 2.1 + / 3.4 +)
بالسماح لتلك الحقول x-
بالإشارة إلى
لذلك يمكننا السماح لقائمة جذر include
لتحديد الملفات المراد تحميلها.
سيتم وضعها في x-include
ويمكن استخدامها على الفور عبر مراسي ودمج YAML القياسي.
# /docker-compose.yml
version: '2.1'
volumes:
nginx_file_sockets:
external: false
driver: local
services:
reverse_proxy:
extends:
file: reverse_proxy/docker-compose.yml
service: proxy
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
reverse_proxy_test:
extends:
file: reverse_proxy/docker-compose.yml
service: proxy
restart: 'always'
ports:
- "8080:80"
- "8443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
web:
extends:
file: webservice/docker-compose.yml
service: app
restart: 'always'
environment:
ENVIRONMENT: 'production'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
web_staging:
extends:
file: webservice/docker-compose.yml
service: app
restart: 'no'
environment:
ENVIRONMENT: 'staging'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
# /proxy/docker-compose.yml
version: '2.1'
services:
proxy:
build: ./
volumes:
- /certs:/certs:ro
# /webservice/docker-compose.yml
version: '2.1'
services:
app:
build:
context: ./folder
args:
LINUX_VERSION: 20.s
LINUX_FLAVOR: dash
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
# /proxy/docker-compose.yml
version: '3.9'
services:
proxy:
&proxy
build: ./
volumes:
- /certs:/certs:ro
# /webservice/docker-compose.yml
version: '3.9'
services:
app:
&app
build:
context: ./folder
args:
LINUX_VERSION: 20.s
LINUX_FLAVOR: dash
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
# /docker-compose.yml
version: '3.9'
include:
- /proxy/docker-compose.yml
- /webservice/docker-compose.yml
volumes:
nginx_file_sockets:
external: false
driver: local
services:
reverse_proxy:
<< : *proxy
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
reverse_proxy_test:
restart: 'always'
<< : *proxy
ports:
- "8080:80"
- "8443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
web:
<< : *app
restart: 'always'
environment:
ENVIRONMENT: 'production'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
web_staging:
restart: 'no'
extends:
file: web1/docker-compose.yml
service: app
environment:
ENVIRONMENT: 'staging'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
@@ /proxy/docker-compose.yml @@
-version: '2.1'
+version: '3.9'
services:
proxy:
+ &proxy
build: ./
volumes:
- /certs:/certs:ro
```
```diff
@@ /webservice/docker-compose.yml @@
-version: '2.1'
+version: '3.9'
services:
app:
+ &app
build:
context: ./folder
args:
LINUX_VERSION: 20.s
LINUX_FLAVOR: dash
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
```
```diff
@@ /docker-compose.yml @@
-version: '2.1'
+version: '3.9'
+include:
+ - /proxy/docker-compose.yml
+ - /webservice/docker-compose.yml
volumes:
nginx_file_sockets:
external: false
driver: local
services:
reverse_proxy:
- extends:
- file: reverse_proxy/docker-compose.yml
- service: proxy
+ << : *proxy
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
reverse_proxy_test:
- extends:
- file: reverse_proxy/docker-compose.yml
- service: proxy
+ << : *proxy
restart: 'no'
ports:
- "8080:80"
- "8443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
web:
- extends:
- file: webservice/docker-compose.yml
- service: app
+ << : *app
restart: 'always'
environment:
ENVIRONMENT: 'production'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
web_staging:
- extends:
- file: webservice/docker-compose.yml
- service: app
+ << : *app
restart: 'no'
environment:
ENVIRONMENT: 'staging'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
```
<hr>
Resulting in the final version, which should be already yaml parsable:
```yml
# /docker-compose.yml
version: '3.9'
#include:
# - /proxy/docker-compose.yml
# - /webservice/docker-compose.yml
x-include:
/proxy/docker-compose.yml:
version: '3.9'
services:
proxy:
&proxy
build: ./
volumes:
- /certs:/certs:ro
/webservice/docker-compose.yml:
version: '3.9'
services:
app:
&app
build:
context: ./folder
args:
LINUX_VERSION: 20.s
LINUX_FLAVOR: dash
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
volumes:
nginx_file_sockets:
external: false
driver: local
services:
reverse_proxy:
<< : *proxy
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
reverse_proxy_test:
<< : *proxy
restart: 'no'
ports:
- "8080:80"
- "8443:443"
volumes:
- nginx_file_sockets:/sockets/nginx
web:
<< : *app
restart: 'always'
environment:
ENVIRONMENT: 'production'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
web_staging:
<< : *app
restart: 'no'
environment:
ENVIRONMENT: 'staging'
DB_USER: ${WEB1_DB_USER}
DB_PASSWORD: ${WEB1_DB_PASS}
volumes:
- nginx_file_sockets:/sockets/nginx
AFAIK هي إحدى ميزات YAML ، المضمنة في مواصفات laguage نفسها ، لتجنب تكرار الأجزاء في نفس الملف. عند استخدام ملفات مختلفة ، فهذا مستحيل أساسًا.
يجب أن تقترح هذه الميزة لمواصفات YAML نفسها.
تختفي هذه المناقشة إلى:
docker-compose -f file.yml
أفضل بكثير من docker-compose -f file.yml -f file_extension.yml
؟فقط عند العمل على سطر الأوامر ، يصبح الإزعاج ملحوظًا. علينا أن نعترف بذلك للحظة. كل شيء آخر هو نصي ، على أي حال.
إذا كانت هذه هي الحجة الحقيقية ، فإن docker-compose up service
لديه دلالات أفضل من docker-compose -f service.yml up
: حدد كل ما هو مطلوب للتنمية المحلية (ويعرف أيضًا باسم سطر الأوامر) في docker-compose.override.yml
.
الدلالات المعطاة نظيفة للغاية ومدروسة جيدًا. ربما يعني اعتماد service.yml
_ لسطر الأوامر use_ تقليل تجربة المستخدم. هناك حجة أخرى لذلك: بينما هو واضح للوهلة الأولى ، ما هو docker-compose.yml
، يمكن أن يكون service.yml
أي شيء ، حقًا أي شيء.
تنويه: رأي استفزازي. : wink: لم آخذ بعين الاعتبار كل حالة استخدام ممكنة ...
بعد هذه المناقشة المطولة ، لست متأكدًا مما إذا كانت ستنجح في أي وقت. IMHO ، كان الامتداد رائعًا ويجب أن يكون قد تم إهماله بعناية على الأقل ثم تمت مناقشته بدلاً من التخلص منه ببساطة.
أعتقد أن أحد الأشياء التي يمكننا القيام بها هو تحسين قصة التوثيق حول الإصدار 2 مقابل الإصدار 3. يفترض الكثير أن الإصدار 3 استبدل الإصدار 2 ، لكن هذا ليس صحيحًا تمامًا. كلاهما يتلقى ميزات جديدة تركز على حالات الاستخدام الخاصة بهما. بدأت مشكلة GH هذه حتى نتمكن من إجراء مناقشة حول الميزات المستقبلية اللازمة لتشق طريقها من docker-compose إلى Swarm ، وكيفية تحسين المستندات لاستخدام docker-compose ، وتنسيق ملف الإنشاء ، و Swarm stacks معًا. لا يزال الامتداد يعمل بشكل رائع في الإصدار 2.4 المحدث. آمل أن أتمكن من المساعدة في تقديم معلومات حول الحلول التي لدينا اليوم:
v2: لـ docker-compose cli فقط. ركز سير عمل التطوير على آلة ومحرك واحد. جيد أيضًا لبناء / اختبار سير عمل CI. تلقى فرع الإصدار هذا ميزات جديدة حتى ديسمبر 2017 في الإصدار 17.12
الإصدار 3: مثالي لمكدسات Swarm / Kube ، مع مفاهيم متعددة العقد ويحافظ على الدعم لمعظم ميزات cli لتكوين عامل الإرساء.
إذا كنت لا تستخدم حزم Swarm أو Docker Enterprise Kubernetes ، فلا يوجد سبب لاستخدام الإصدار 3 . العصا مع V2.4، وتحصل على كل CLI-عامل ميناء يؤلف الميزات بما في ذلك يمتد، depends_on والحقول الإرشادية، وحتى depends_on مع healthchecks (لتجنب الانتظار مقابل ذلك البرامج النصية).
تم إنشاء v3 لمحاولة دمج ميزات عالم cli المكون من عامل إرساء بمحرك واحد مع عالم مجموعة متعدد العقد. ليست كل ميزات v2 (مثل تعتمد على) منطقية في المجموعة. الميزات الأخرى (مثل الامتداد) لم يتم تحويلها إلى الإصدار 3 ، على الأرجح لأنه قبل وجود الإصدار 3 ، كانت جميع الكودات في بايثون ، ولإصدار 3.0 لدعم Swarm ، كان عليهم إعادة كتابة ذلك في docker cli Go ، والآن يقومون بكتابته مرة أخرى في برنامج المحرك الخفي ليصنعوا في النهاية واجهة برمجة تطبيقات Swarm Stacks ، والتي لم تكن موجودة بعد.
بالنسبة لأولئك الجدد في هذه المشكلة ، لاحظ أيضًا الكثير من العمل الجاري لحل مشكلات التكوين والقوالب وسير عمل الفريق المختلفة منذ الإصدار 3.0:
يجب أن تؤكد المستندات الموجودة على https://docs.docker.com/compose/extends/#extending -services باللون الأحمر على حقيقة أن الكلمة الأساسية الموسعة تمت إزالتها في الإصدار 3 ، لأنها أكثر أهمية من مجرد _note_.
لقد قمت بترحيل المستندات وتصفحها لمعرفة سبب توقفها عن العمل ، ثم تابعت العديد من المشكلات المغلقة قبل أن ينتهي بي الأمر هنا ، ثم عدت إلى المستندات الأصلية ولاحظت الصياغة.
يتم دعم الكلمة الأساسية الموسعة في تنسيقات ملفات Compose السابقة حتى إصدار ملف Compose 2.1 (انظر يمتد في v1 ويمتد في v2) ، ولكن لا يتم دعمه في إنشاء الإصدار 3.x.
يمكن إعادة صياغتها على النحو التالي:
تمت إزالة الكلمة الأساسية الموسعة في إصدار Compose 3.x ، لكنها لا تزال مدعومة في تنسيقات ملفات Compose السابقة حتى إصدار ملف Compose 2.1 (انظر التوسيع في v1 ويمتد في v2).
إنه فرق بسيط ، لكن من السهل التغاضي عنه عند مسح المستندات.
@ krisrp العلاقات العامة بدأت
شكرا BretFisher
هل هناك أي خطط لإعادة تسمية v2 إلى "version: docker-cli" و v3 إلى "version: swarm / kube"؟
سيكون من المنطقي التمييز بينها بهذه الطريقة ، مع الأخذ في الاعتبار كيف أن الإصدار 3 يحل محل الإصدار 2 في معظم أنظمة النسخ الأخرى. في الوقت الحالي ، يتم الحفاظ على كلاهما وتباعدهما ، لذلك ما لم أكن مخطئًا ، يبدو أنهما سيكونان في الجوار لفترة من الوقت.
krisrp على العكس من ذلك ، فإن سبب زيادة رقم إصدار رئيسي هو الإشارة إلى الاختلاف في التوافق.
@ cpuguy83 لم أكن
كان لدى IIRC Gnome 2 & 3 أيضًا هذا الارتباك منذ سنوات عندما تم الحفاظ على شوكات مستقلة لكل منها.
لا أريد إخراج هذا الموضوع عن مساره لمناقشة دلالات تعيين الإصدار (التورية السيئة) ، لذلك سأتركه عند هذا الحد. كانت مشاركة ستساعدني وربما الآخرين.
@ shin- @ cpuguy83 بالنظر إلى هذه المشكلة بعد أكثر من عام ، ما هو سبب عدم إضافتها مرة أخرى في الإصدار 3؟
لم أتمكن من العثور على الكثير حول هذا الموضوع ، بخلاف "يمكننا القيام بذلك بشكل مختلف" (ولكن لم يتم تقديم حل فعلي أفضل)
هل هناك قيود فنية؟ أو مجرد عدم وجود طلب سحب؟
بعد كل شيء ، لا تزال ملفات تكوين 2.1 الخاصة بي تعمل بشكل جيد.
ليس هذا فقط ، ولكن سجل التغيير يقول "تمت إزالة هذا ، راجع" كيفية الترقية "للحصول على التفاصيل". ألقي نظرة على "كيفية الترقية" ، كما تعلمون ، للحصول على تفاصيل حول كيفية الترقية ، وما يقوله ذلك هو "انظر" توسيع الخدمات "للحصول على التفاصيل". أذهب إلى "خدمات الموسعة" لأرى أخيرًا طريقة لتوسيع ملفاتي ، فقط لأرى "تمت إزالة هذا ، راجع سجل التغيير للحصول على التفاصيل".
في هذه المرحلة ، يبدو هذا وكأنه نكتة قاسية يلعبها كاتب التوثيق.
في النهاية ، لا يتم التحكم في تنسيق "المكدس" هنا وهو جزء من Docker CLI.
أنا شخصياً لا أعرف سبب استبعاده من الإصدار 3 ... كما أنني لا أعتقد أنني رأيت أي شخص يحاول بالفعل إضافته.
قد يكون من الأفضل طرح هذا الأمر في docker / cli ... ربما حتى مجرد علاقات عامة مع تغيير مستند عالي المستوى يعمل كما لو كانت الميزة موجودة بحيث يمكن مناقشتها ويمكن إضافة التنفيذ بمجرد الموافقة على التصميم .
في الأساس ، إذا أراد شخص ما ، قم بعمل علاقات عامة. أقترح تغيير المستند فقط للتأكد من أنك لا تضيع الكثير من الوقت في حالة رفضه ... منذ مرة أخرى ، لست متأكدًا من سبب حذفه من الإصدار 3.
كما ورد أعلاه. في انتظار حل هذا قبل استخدام عامل البناء مرة أخرى.
+1 يرجى إصلاح هذا ، فلدينا ملفات إنشاء قائمة على تمديد ولا يمكننا استخدام إنشاء سرب بسبب ذلك.
+1 لتمديد الميزة
أي أخبار عن هذا؟
ما زلت في انتظار ذلك
كذلك هنا. مازلت منتظرا.
أي تحديث؟
هل تم تقديم أي سبب على الإطلاق لسبب إزالته؟
في الإثنين ، 5 أغسطس 2019 ، الساعة 11:10 ، كتب Jaykishan ، [email protected] :
أي تحديث؟
-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/moby/moby/issues/31101؟
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ABOE6GCEFFJ3SOLDWRWX2IDQC74CZANCNFSM4DANZGSQ
.
أي تحديث؟
لذلك .. لقد مر ما يقرب من 3 سنوات ...
لكن ما زلت آمل أن تهبط: د
يجب أن يكون هناك نوع من البديل للتمديد إذا لم يعود. لماذا لا نسمح للخدمات المجردة؟ سيكون تنسيق الملف ثابتًا وستكون جميع إقرارات الخدمة في ملف واحد. يمكنك استخدام خدمات مجردة جنبًا إلى جنب مع قدرة yaml على إضافة أسماء مستعارة للعقدة (عبر &
) لإعادة استخدام هذه الأسماء المستعارة عبر عامل التشغيل <<:
.
لماذا 3 سنوات !! يبدو أنك تعمل وتركز على أشياء لا يهتم بها أحد
أي تحديث على هذا؟
هذا مثير للشفقة. يستخدم Terraform التركيب - لذا فهو قابل للتنفيذ ، فلماذا لا يستطيع التأليف متابعة ممارسات التصميم الجيدة هذه ؟!
تكوين وحدات Terraform
أفضل ممارسات Terraform
"مثير للشفقة" ، لطيف.
@ Cristian-Malinescu تفضل بتنفيذها من فضلك.
هذا برنامج مجاني ومفتوح المصدر.
بدلاً من الشكوى مثل أي شخص آخر في هذه الدردشة.
هذا فقط لا يضيف أي قيمة هنا ، حقًا.
كما قيل عدة مرات ، لم يرغب أحد في تنفيذ ذلك حتى الآن ،
لذا فهي مجرد مشكلة يجب على شخص آخر إصلاحها ، شكرًا.
luckydonald بفضل إبعاد @ Cristian-Malinescu بإجابة سهلة / سلبية-عدوانية ، إنها ، مثل عدم المساعدة دائمًا. @ Cristian-Malinescu إنه قابل للتنفيذ كما تم بالفعل من قبل ولكن تمت إزالته ، يجب (آمل) أن يكون هناك سبب. هل يوجد أي شخص على هذا الموضوع في فريق إنشاء عامل التحميل حتى يتمكن من إلقاء الضوء على شيء؟
تم ذكر الخيط المقشود والاستفادة من وظائف YAML المدعومة.
يعتقد أن هذا المثال قد يساعد.
nomasprime شكرا لك على هذا الاكتشاف! كنت أقرر بين الإصدارين 2 و 3 لمشروعي ، وقد أدى ذلك إلى حل المعضلة الكبيرة في هذا الموضوع. متفاجئ أن هذه الحلول البديلة غير مذكورة في المستندات الرسمية لميزة الخدمات الموسعة.
رائع ، يبدو أنه فرصة جيدة لاستخدام رابط Request docs changes
على شريط التنقل الأيمن لصفحة المستندات.
nomasprime نعم ، كانت هذه الفكرة موجودة في هذا الموضوع من قبل.
إذا أمكن دمج ذلك مع آلية تحميل ملفات لملفات yml الأخرى ، فهذا كل ما هو مطلوب حقًا للحصول على جميع وظائف depends
القديمة.
انظر أعلاه ، على سبيل المثال https://github.com/moby/moby/issues/31101#issuecomment -413323610
لن يكون _ قابلاً للقراءة_ جدًا ، ولكنه سيكون _ على الأقل _ ممكنًا _.
nomasprime شكرا لك على هذا الاكتشاف! كنت أقرر بين الإصدارين 2 و 3 لمشروعي ، وقد أدى ذلك إلى حل المعضلة الكبيرة في هذا الموضوع.
arseniybanayev المقالة على الوسيط تقول عن الإصدار 3 فقط ، لكن الإصدارات الأحدث من v2 تدعم أيضًا الارتساء وحقول الامتداد . في حالتي ، اخترت الإصدار 2 (2.4 بشكل أكثر تحديدًا) لأنني استخدم docker-compose
وليس swarm
(و v3 لا يدعم بعض ميزات v2 مثل الحد من ذاكرة الحاوية )
و v3 لا يدعم بعض ميزات v2 مثل الحد من ذاكرة الحاوية
يدعم الإصدار 3 تقييد الذاكرة ، لكن الحقل أقل من deploy -> resources -> limits
https://docs.docker.com/compose/compose-file/#resources
thaJeztah أعني ، مقابل docker-compose
(لأنني لا أستخدم سربًا في المشروع الذي كنت أشير إليه في تعليقي السابق). انتشار IIRC هو فقط للسرب ، أليس كذلك؟
هل من المنطقي عمل تكوين منفصل للسرب والمحلي؟ يبدو أن هذين متعارضين مع بعضهما البعض. من المفهوم أن Docker يرغب في زيادة استخدام السرب ، لكن الكثير من الناس يستخدمون التأليف فقط من أجل التنمية المحلية.
أنا شخصياً لم أستخدم أبدًا حاويات سرب وتشغيلها في الإنتاج باستخدام ECS أو k8s أو GAE.
يجب أن تكون معظم الخيارات قابلة للترجمة / قابلة للاستخدام لكل من خدمات السرب / kubernetes وللحاويات التي تم نشرها من خلال الإنشاء. يجب أن أتحقق من سبب عدم تطبيق حدود memory
على docker-compose
ما زلت أفتقد ميزة الامتدادات ، ولكن بالنسبة لحالة الاستخدام الرئيسية الخاصة بي ، قمت بالتبديل إلى ملفات إنشاء عامل الإرساء المتعددة عبر COMPOSE_FILE
env. أنا أستخدمه في الغالب لاستخدام نفس قاعدة docker-compose.yml من أجل dev و prod بكلمات مرور أو تكوين مختلف.
مثال:
export COMPOSE_FILE=
docker-compose.yml` # افتراضيexport COMPOSE_FILE=
docker-compose. yml: docker-compose.prod.yml `# يستخدم كلا ملفي yamlفي docker-compose.prod.yml
قمت فقط بالكتابة فوق env vars بكلمات مرور prod.
هذا الإعداد بسيط ولا أحتاج دائمًا إلى إضافة "-f" متعددة إلى الأمر docker-compose
. أحتاج فقط إلى تعيين COMPOSE_FILE
env var بشكل مختلف على كمبيوتر dev والخادم وتجاهل git ملف docker-compose.prod.yml.
مازلت منتظرا :)
لقد كنت أستخدم هذا كوسيلة للتوسيع:
docker-compose \
-f ./docker/base.yml \
-f ./docker/extended.yml \
up
لكن التمديد في الملف سيكون أجمل ، فلا حاجة إلى نص برمجي إضافي.
لقد كنت أستخدم هذا أيضًا للتمديد ديناميكيًا من نص bash النصي:
extended_docker_compose="
version: '3.5'
services:
my-service:
restart: always
"
echo "$extended_docker_compose" | docker-compose \
-f ./docker/base.yml \
-f /dev/stdin \
up
@ dave-dm هذه تجاوزات قديمة بسيطة!
أعتقد أن هذه حالة استخدام محتملة صالحة للتمديد
https://github.com/NerdsvilleCEO/devtools/blob/master/doctl/docker-compose.yml#L10
لدي غلاف docker-compose
والذي أستخدمه لجذب الخدمات https://github.com/nowakowskir/docker-compose-wrapper
تحرير: حالة استخدام أخرى محتملة هي أن شخصًا ما لديه حزمة LAMP / LEMP ويريد توسيع هذه الخدمات لاستخدامها مع خدمة معينة مثل Wordpress
لا تزال تنتظر منذ عام 2017 أثناء استكشاف بدائل إنشاء عامل ميناء.
nomasprime نعم ، كانت هذه الفكرة موجودة في هذا الموضوع من قبل.
إذا أمكن دمج ذلك مع آلية تحميل ملفات لملفات yml الأخرى ، فهذا كل ما هو مطلوب حقًا للحصول على جميع وظائف
depends
القديمة.انظر أعلاه ، على سبيل المثال # 31101 (تعليق)
لن يكون _ قابلاً للقراءة_ جدًا ، ولكنه سيكون _ على الأقل _ ممكنًا _.
luckydonald شكرا للإشارة. من الغريب أنه لا توجد وظائف مدمجة في YAML ، فمن المؤكد أنها ستحل الكثير من المشكلات.
يبدو أنه سيكون من السهل جدًا تنفيذ حل تابع لجهة خارجية على الرغم من أنك لست متأكدًا من سبب عدم إحضار هذا إلى الإصدار 3 🤷♂
تذكير بسيط بأن الكثير من الأشخاص يرغبون في هذه الميزة :)
ما هو سبب عدم تحويله إلى الإصدار 3 بالمناسبة؟
نسيت ولكن هل هناك سبب حقيقي لسحبها؟
في الأربعاء ، 6 مايو 2020 ، الساعة 23:14 ، كتب Julien Marechal ، [email protected] :
تذكير بسيط بأن الكثير من الأشخاص يرغبون في هذه الميزة :)
-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/moby/moby/issues/31101#issuecomment-624919070 ، أو
إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/ABOE6GGDIVGATP734YJA4UTRQHOLJANCNFSM4DANZGSQ
.
الطريقة التي تتعامل بها مراسي yaml مع حالة الاستخدام هذه غير ملائمة بعض الشيء مقارنةً بـ extend
. إنها القوة ، في رأيي ، أتت إلى حد كبير من الدمج المتكرر للعناصر. تصلك المراسي إلى 75٪ من الطريق إلى هناك - فهي لا تدمج yaml بشكل متكرر ؛ كل ما تبذلونه من الدمج يحدث في المستوى الأعلى. ستؤدي الإشارة إلى قالب خدمة مثبتة ثم إعادة تعريف كتلة environment
إلى استبدال كتلة بيئة الخدمة المثبتة بدلاً من الدمج. ستحتاج إلى إرساء كل قاموس والإشارة إليه أسفل شجرة متكررة من القواميس من أجل مطابقة سلوك الكلمة الرئيسية extend
.
مثال:
# anchors for the service, environment, deploy, and deploy.placement blocks
# you'll need an anchor for every dict that you want to merge into
x-common-app: &common-app
image: app:1.0
environment: &common-app-environment
common_option: a
overwrite_option: b
deploy: &common-app-deploy
max-replicas-per-host: 3
placement: &common-app-deploy-placement
constraints:
- 'node.labels.app_host==true'
services:
myapp: << *common-app
environment: << *common-app-environment
foo: bar
baz: xyzzy
overwrite_option: quz
deploy: << *common-app-deploy
replicas: 15
placement: << *common-app-deploy-placement
preferences:
- spread: node.labels.region
# The above yields the following:
services:
myapp:
image: app:1.0
environment:
common_option: a
overwrite_option: quz
foo: bar
baz: xyzzy
deploy:
replicas: 15
max-replicas-per-host: 3
placement:
constraints:
- 'node.labels.app_host==true'
preferences:
- spread: node.labels.region
قد لا يبدو الأمر مزعجًا للغاية في هذا المثال ، ولكنه يصبح مزعجًا ويصبح أقل قابلية للقراءة إذا كنت تقوم بعمل قوالب لخدمات متعددة (10+) من كتلة امتداد واحدة.
في رأيي ، السيناريو المثالي هو مزيج من نهج yaml anchor ونهج extend
- السماح extend
ing فقط من مستوى أعلى x-
كتلة حقل ملحق مسبوقة ، مع خصائص الدمج الأكثر ذكاءً.
في مؤسستي وجدنا أن المراسي yaml قذرة بعض الشيء من الناحية التركيبية ، لذا قمنا بإعادة تطبيق ميزة extend
في برنامج نصي خارجي من نوع Python. هذا يعمل بالنسبة لنا ، لكنها طريقة واهية للتعامل مع شيء ما. وبالمثل ، كان علينا إنشاء أدوات خارجية خاصة بنا للتعامل مع إزالة depends_on
مقابل v3 / Swarm stacks.
لقد فعلت الكثير من gitlab CI YAML مؤخرًا. إنه يحتوي على هذه الميزات بالضبط ، والتي تعد رائعة جدًا لتحقيق قوالب وتكوينات نهائية يمكن قراءتها وإدارتها:
x-
، في gitlab CI هو .
مبدئيًا بدلاً من ذلك.هذه هي مجموعة الميزات الدقيقة التي تجعل هذه الملفات محتملة.
لقد وصلت إلى هذه المشكلة من مستندات عامل الإرساء ، وفي حالتي كنت أرغب في إنشاء نموذج لإعدادات docker-compose
، وكحل بديل ، اتبعت النصيحة أعلاه وقررت البحث عن برنامج قوالب حالي. لن أستعيد تلك الساعات ، لذا فأنا أورد بالتفصيل القليل مما وجدته هنا ، بغض النظر عن أي مناقشة حول طلب الميزة الفعلي هذا ، ومع ذلك ، قد يشعر المشاركون باستخدام نظام قوالب يستند إلى YAML إنشاء ملف إنشاء بدلاً من دمج هذه الميزة في docker-compose
نفسها قد يكون أكثر ملاءمة من حيث التغليف واختيار الأداة المناسبة للوظيفة.
بالنسبة لبعض السياق ، أستخدم وكيلًا عكسيًا أساسيًا مع Let's Encrypt والعديد من حاويات التطبيق (Nextcloud حاليًا ، واحد لي ، وبعض الحاويات المنفصلة للأصدقاء) - في هذه الحالة ، أردت إنشاء قالب لحاويات Nextcloud لذلك أنني أتجنب الأخطاء والازدواجية بضربات المفاتيح للإعدادات المتشابهة جدًا. الحزم التالية كانت ما جربته:
يبدو ytt شاملاً للغاية وهو الخيار الوحيد لاستخدام YAML محليًا. بدت قوية والأداة المناسبة للمهمة ، وتستخدم Starlark ، مجموعة شاملة من Python ، مباشرة داخل ملف YAML لإجراء المعالجة. ومع ذلك ، بعد فترة ليست طويلة ، أصبح القالب فوضويًا للغاية ، وتناثر أجزاء من التعليمات البرمجية وأجزاء من YAML ، بالإضافة إلى خلط أنواع بيانات Python مثل القواميس والمصفوفات وأجزاء YAML (التي يبدو أنها تتم معالجتها إلى حد ما مثل النص ، إلى حد ما مثل استخدام محرك قالب HTML الذي ينتج عنه علامات مثل السلاسل) أدى في النهاية إلى العديد من الأخطاء وفوضى الملف. يبدو Dhall أيضًا شاملاً للغاية ويستخدم لغة أصلية فريدة يمكن إخراجها إلى مجموعة متنوعة من التنسيقات ؛ يبدو الأمر أشبه بلغة البرمجة الوصفية أكثر من كونه نظامًا نموذجيًا ، ولكن بالنظر إلى أن بناء الجملة وظيفي ويتم كتابته بدقة شديدة ، سرعان ما أصبح أكثر تعقيدًا مما كان يستحق ذلك بالنسبة لقالب بسيط لـ YAML غير منظم. نظرًا لما يبدو قليلاً مثل مزيج من JSON و Haskell ، فقد تطلب الأمر الكثير من التفكير في العمل على ما أحتاجه في اللغة.
من المثير للاهتمام ، أنه في بعض الأحيان كان الأمر صعبًا مع كل من Dhall و ytt كانا يستخدمان أسماء الحقول ذات المعلمات ، وكلاهما كان سيعمل بشكل جيد بما فيه الكفاية ، لكنني بحاجة إلى ظهور اسم المثيل الخاص بي في أسماء الخدمات ووحدات التخزين ، وفي كلاهما كان هذا قبيحًا إلى حد ما ؛ يعد استخدام الحجج للقيم في التجزئة أمرًا سهلاً ، ولكن استخدام هذه الوسيطات في أسماء المفاتيح كان فوضويًا أو لم أتمكن من العثور على كيفية القيام بذلك بدقة ، بالإضافة إلى أن Dhall يفرض أمان الكتابة وهذا يتعارض مع هذا المفهوم. مع Jsonnet كان الأمر بسيطًا مثل وضع التعبير بين قوسين مربعين.
إن كلا من CUE و Jsonnet موجهان إلى JSON ، ولكن تشغيلهما من خلال محول ليس بالأمر الصعب على الإطلاق ، ويبدو مرة أخرى ، مثل Dhall ، أن CUE لديها الكثير من الميزات القوية وقد ولدت من عيوب في Jsonnet ، ولكن جزئيًا في التوثيق ، أصبح من الواضح أنها كانت مبالغة بالفعل ؛ ربما مع مزيد من الوقت لتعلمه بشكل صحيح ، سيكون الخيار الأفضل ، لكن يبدو أن CUE أكثر توجهاً نحو التحقق من الصحة والتخطيط أكثر من وظيفة القالب البسيطة ، ولذا انتقلت بسرعة إلى Jsonnet وأنهيت المهمة بسرعة كبيرة.
أخيرًا ، فقط بعد أن أكملت كل هذا أدركت طوال الوقت الذي كنت أقارن فيه هذه الأدوات ببساطة العلامات السائلة أو قوالب HTML المماثلة ، ربما كان بإمكاني في الواقع استخدام Liquid في المقام الأول. لقد استخدمته فقط في سياق موقع Jekyll ، لذلك لم يحدث لي مطلقًا بعد أن أحصل على حزمة قائمة بذاتها ، ولكن مع التكرار الأساسي والقوائم ، والقدرة على تقييم التعبيرات مباشرة في نص في المكان ، من المحتمل أن يكون هذا كان أفضل بكثير بالنسبة للوظيفة ؛ من المحتمل أن يكون Jsonify هو الأفضل بالنسبة لـ JSON ، ولكن السائل يمكن أن يعمل في YAML النقي وبالتالي يصبح الملف أكثر قابلية للقراءة مرة أخرى.
كان +1 مصدر إلهام للحل المفصل الذي قمت بتطبيقه في العمل منذ أن تم إنشاء هذه التذكرة لدعم ترحيل عدد كبير من أدوات الاختبار إلى k8s. كنت حريصًا جدًا على تجنب الأجراس والصفارات ولكن سرعان ما بررت ميزة مماثلة. تبدو المناقشة الفلسفية (التركيب مقابل الميراث وما إلى ذلك) بالنسبة لي وكأنها إلهاء عن الفطرة السليمة (مع الإدراك المتأخر - لا يزال بدون حل بعد ما يقرب من 3 سنوات). من الواضح أنه مطلوب من قبل الأشخاص الذين قد يستمرون في استخدام عامل البناء.
+1: +1:
لقد استخدمت هذه الميزة بكثرة من قبل لبيئات dev
/ test
/ ci
، حيث يمكنني التمديد من ملف إنشاء في مسارات دليل فرعي ./config/{dev,test,ci}/compose.yaml
. كان لديّ .env
يحتوي على COMPOSE_ENV=dev
، لكن يمكن للمطوّرين تجاوزه ، ومن الواضح أنني سأتجاوز ci
.
لقد صدمت بإهمال الميزة وعدم استبدالها بشيء يمكن أن يفعل شيئًا مشابهًا. ربما تسمح لنا فقط باستخدام jinja2 والقيام بما نريد. آمل أن يكون Docker-Compose أقل مقاومة للجفاف. : '(
يبدو أن extends
مدعوم من docker-compose
منذ الإصدار 1.27 (https://github.com/docker/compose/pull/7588).
إحدى حالات الاستخدام التي أستخدم فيها الميزة بكثرة ، هي إصدار صور عامل الإرساء إلى التعليمات البرمجية. يمتد كلا من ملفي إنشاء docker dev و prod من docker-images.yml حيث يتم سرد الخدمة الأساسية فقط وإصدار ذي علامات من صورة الخدمة.
لم يتم العثور على حل سهل لهذا في الإصدار 3.
التعليق الأكثر فائدة
ليس هذا فقط ، ولكن سجل التغيير يقول "تمت إزالة هذا ، راجع" كيفية الترقية "للحصول على التفاصيل". ألقي نظرة على "كيفية الترقية" ، كما تعلمون ، للحصول على تفاصيل حول كيفية الترقية ، وما يقوله ذلك هو "انظر" توسيع الخدمات "للحصول على التفاصيل". أذهب إلى "خدمات الموسعة" لأرى أخيرًا طريقة لتوسيع ملفاتي ، فقط لأرى "تمت إزالة هذا ، راجع سجل التغيير للحصول على التفاصيل".
في هذه المرحلة ، يبدو هذا وكأنه نكتة قاسية يلعبها كاتب التوثيق.