Compose: docker-compose copy file أو directory to container

تم إنشاؤها على ١ يناير ٢٠١٨  ·  141تعليقات  ·  مصدر: docker/compose

نفقد إمكانية نسخ ملف أو دليل باستخدام docker-compose. أجد هذا مفيد حقا.
يرجى التحقق من العديد من +1 في الإغلاق المبكر https://github.com/docker/compose/issues/2105

kinfeature statu0-triage

التعليق الأكثر فائدة

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

إذا أراد المستخدمون القيام بأشياء ضارة باستخدام Docker ، فسيجدون طريقة بغض النظر عما تفعله. إن رفض إضافة ميزات مشروعة لمجرد أن شخصًا ما قد يسيء استخدامها يومًا ما هو أمر أحمق.

ال 141 كومينتر

ما هي حالة الاستخدام؟ معظم الاستخدام المقترح الذي رأيته كان مضادًا.

يمكنك رؤية بعض العديد من حالات الاستخدام بالنقر فوق الارتباط المقدم. كما ترى فإن العديد من المشتركين يعتبرونها ميزة مفيدة حقًا بدلاً من "antipattern"

عفوًا ، الآن أرى "شيئًا" حدث للإصدار رقم 2105 حيث لم تعد هناك تعليقات على الإطلاق ...
ربما قدمت رابطًا خاطئًا ...

لذلك ، أجد من المفيد حقًا نسخ بعض ملفات التكوين / التهيئة إلى الحاوية. على سبيل المثال ، بعض عناصر * .sql لحاويات db ، وبعض محتويات html / js / css لحاويات apache / nginx أو حتى ملف jar لحاوية جافا. سيؤدي ذلك إلى جعله متاحًا / قابلًا للتشغيل "عالميًا" ليس فقط على الجهاز الذي تم تكوينه فيه كما في حالة وحدات التخزين المتصاعدة. سيكون هذا بشكل أساسي مزيجًا من الملفات المضيفة المحلية والملفات المضمنة في الحاوية. في الواقع ، يمكن اعتبار أي حاوية عديمة الفائدة دون أي تكوين أو تهيئة

هذا هو الرابط الصحيح: https://github.com/docker/compose/issues/1664

+1

سيؤدي ذلك إلى جعله متاحًا / قابلًا للتشغيل "عالميًا" ليس فقط على الجهاز الذي تم تكوينه فيه كما هو الحال في حالة وحدة التخزين

تكمن المشكلة في هذا في أنه قصير النظر بشكل لا يصدق (ومن هنا جاء مصطلح "النمط المضاد") ، حيث سيجبرك على تكرار العملية في كل مرة يتم إعادة إنشاء الحاويات. ناهيك عن حقيقة أن قشورها سيئة للغاية (ماذا لو كان لديك 10 حاويات؟ 20؟ 100؟)

الحل الفعلي لمشكلتك هو تضمين تلك الملفات الضرورية في بنائك (Dockerfile) وإعادة البناء عند الحاجة إلى تحديث.

بالطبع ، إذا تم تكوينه بما في ذلك كل المحتوى "المشترك" في الحاوية ، فسيكون التحجيم 10-20-100- حاوية أسهل بكثير. كل ما تحتاجه هو سحبها من المستودع وتركيبها (نعم ، في هذه الحالة) فقط التكوين الخاص بالعقدة. وأكثر من ذلك ، لا تحتاج إلى تشغيل عامل إنشاء على كل عقدة.
بالتأكيد يمكننا استخدام docker-compose جنبًا إلى جنب مع build: & Dockerfile ، لكن الأمور تصبح أكثر تعقيدًا قليلاً وتكوين yaml في docker-compose "أنيق" أكثر بكثير: o)

أواجه مشكلة حيث يكون النسخ في متناول اليد (على الأقل كتجاوز). أقوم بالتطوير في الغالب على نظام التشغيل Mac ، لذلك لا أرى مشكلة في تشغيل الأوامر كجذر في الحاوية والتصدير إلى وحدة تخزين محمولة. ومع ذلك ، فإن استخدام نفس سير العمل على CentOs تسبب في بعض الألم الشديد لأن الملفات التي يمتلكها المستخدم الجذر تتم إضافتها إلى المضيف عبر وحدة التخزين المحملة. أود في هذه الحالات أن أكون قادرًا فقط على نسخ ملفات المضيف إلى الحاوية بدلاً من تحميلها.

القضية ذات الصلة: # 1532

تحديث

أعتقد أنه في حالتي يمكنني الابتعاد عن استخدام COPY في Dockerfile وامتلاك عدة ملفات مكونة من عامل إرساء يستخدم أحدها وحدة تخزين.

حالة الاستخدام:
أريد استخدام دليل من نظام ملفات للقراءة فقط داخل الحاوية. يقوم التطبيق بإنشاء ملفات جديدة في هذا الدليل ، ولكن نظرًا لأن نظام الملفات يُقرأ فقط ، فإن هذا يتسبب في حدوث أخطاء.

لا يمكنني استخدام حجم rw ، لأن نظام الملفات للقراءة فقط.
لا يمكنني استخدام حجم ro ، لأن التأثير سيكون هو نفسه.

سيكون من الرائع عمل كتابات تستمر فقط عند تشغيل الحاوية. يمكنني إنشاء غلاف (https://stackoverflow.com/questions/36362233/can-a-dockerfile-extend-another-one) لملفات COPY ، ولكن جعل هذا في إنشاء ، على غرار volume ، سيكون أفضل

حالة الاستخدام: بدء تشغيل عدة حاويات عامل إرساء في وقت واحد من .gitlab-ci.yml والتي تحتاج إلى الكتابة في دليل مستودع git.

إذا فشلت العملية داخل الحاوية أو إذا تم إلغاء مهمة ci قبل تنظيف الحاوية بعد نفسها ، فلا يمكن حذف الملفات المتبقية بواسطة gitlab-runner بسبب نقص الأذونات. الآن يمكنني نسخ الملفات الموجودة داخل الحاوية خارج المجلد إلى دليل آخر ، لكن هذا سيكون مضادًا ، أليس كذلك؟

هل هذا يختلف عن volumes: - ./folder_on_host/ :/folder_in_container/ ؟
يمكنني نسخ الملفات من مضيف إلى حاوية (ما يعادل النسخ) بهذه الطريقة في ملف الإنشاء الخاص بي

harpratap أنت على حق ، لكن العيب هو أن / folder_in_container يجب ألا يكون موجودًا أو يجب أن يكون فارغًا وإلا فسيتم استبداله. إذا كان لديك برنامج نصي bash كنقطة دخول ، فيمكنك التحايل على هذا عن طريق ربط ملفاتك بالدليل المقصود أصلاً بعد إنشاء مجلد في / some_empty_location

+1 للحصول على وظيفة النسخ. حالة الاستخدام الخاصة بنا تتعلق بالوقوف السريع لبيئات التطوير المحلية والنسخ في التكوينات لإعدادات التطوير.

+1 للنسخ. سيكون هذا حقا ميزة مفيدة.

حالة الاستخدام: في وضع السرب ، لدي خدمة تستخدم صورة mysql. أحتاج إلى نسخ scripst التهيئة في /docker-entrypoint-initdb.d/ حتى تتمكن MySQL من تنفيذها.

على الرغم من أنه من الممكن إنشاء صورة أعلى mysql ، انسخ الملفات واستخدمها أو اتصل بـ mysql
مهمة في سرب ثم قم بتشغيل البرامج النصية يدويًا ، فهي غير ضرورية في رأيي.

+1 للنسخ / الإضافة ،

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

+1 للنسخ

لنفترض أن أحدهم لديه ملف تكوين مشترك عبر عدد من أجهزة الرصيف ، مع ملفات Dockerfiles الخاصة به في الدلائل الفرعية المعنية ضمن دليل docker-compose. كيف تنسخ هذا التكوين المشترك في كل صورة؟ لا يمكنني الارتباط رمزياً بـ ../ من سياق Dockerfile بدون الحصول على COPY failed: Forbidden path outside the build context

في هذه الحالة عند تشغيل docker-compose build ، أود نسخ ملفات التكوين من سياق docker-compose قبل تشغيل خطوات إنشاء عامل الإرساء.

يسعدني أن يقترح أحدهم حلاً نظيفًا بالطبع.

سيكون من الجميل أن يكون لديك ميزة !!

من فضلك لا تعلق بمجرد +1 - فهذا مضيعة لوقت الجميع. إذا كانت لديك معلومات إضافية تريد تقديمها ، فيرجى القيام بذلك ؛ بخلاف ذلك ، ما عليك سوى إضافة علامة رائعة على الإصدار الأصلي.

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

إذا أراد المستخدمون القيام بأشياء ضارة باستخدام Docker ، فسيجدون طريقة بغض النظر عما تفعله. إن رفض إضافة ميزات مشروعة لمجرد أن شخصًا ما قد يسيء استخدامها يومًا ما هو أمر أحمق.

أعتقد أن ما تفعله هو في الواقع الطريقة الصحيحة للقيام بذلك ، في هذه الحالة.

كانت المشكلة التي أثيرت هنا أكثر شبهاً ، لنفترض أن ملف mongo.conf تمت مشاركته بين ثلاث صور عامل ميناء تم تنسيقها بواسطة ملف إنشاء عامل ميناء واحد. كيف يمكنك التأكد من أنه هو نفسه في كل دليل فرعي لبناء عامل ميناء؟

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

لذا فإن الطريقة الوحيدة لتنظيم ذلك هي باستخدام نسخة ملف ، والتي يحتاج المرء حاليًا إلى القيام بها باستخدام برنامج Makefile أو برنامج shell قبل تشغيل docker-compose ، لذلك بدا الأمر وكأنه فكرة لمناقشة ما إذا كانت هذه ميزة يمكن لـ docker-compose تكوينها تفعل ، لأنها بالتأكيد حالة استخدام شائع.

يبدو أن المشكلة التي تثيرها تتعلق بشكل أكبر بحقن وقت التشغيل (وقت التشغيل) لتعديل ملف محلي.

أعتقد أنك بخير حقًا فيما تفعله ، وما قلته أعلاه هو فقط كيف يتم ذلك. يمكن دائمًا إنشاء صورة عامل إرساء لقبول متغيرات البيئة للإجابة على أسئلة مثل أين يوجد دليل التكوين ، ويمكن "حقن" دليل التكوين هذا باستخدام وحدة تخزين في وقت التشغيل - ولكن هذا يرجع إلى تصميم صورة عامل الإرساء ، والاستفادة من متغيرات البيئة وتعيينات الحجم (وهي ميزات يدعمها عامل الإرساء كتعديل لتهيئة وقت التشغيل.)

آمل ألا أكون قد أساء تفسير تعليقك ، وأن يكون ردي مفيدًا.

jpz - لقد حذفت تعليقي الأصلي بطريقة ما - yikes - آسف! شكرا لك - نعم ، هذا مفيد.

كان تعليقي الأصلي على غرار:

حالة الاستخدام الخاصة بي هي أنني أريد الإعلان عن خدمة باستخدام mongo دون الحاجة إلى إنشاء صورتي المخصصة فقط لنسخ ملف تكوين مثل /etc/mongod.conf .

تحديث: استخدمت volumes . قبل عام أو عامين - اعتقدت أنني جربت هذا بتجربة سيئة ... لكن يبدو أنه جيد.

+1 للنسخ

لقد خلقت فكرة سريعة لهذا. يفترض أن خدمة إنشاء عامل الإرساء تحمل اسم phpfpm ، ومع ذلك يمكنك تغيير هذا إلى ما تريد. لا تتردد في التعديل.
https://gist.github.com/markoshust/15efb29aa5eebf8adae402af18b2e674

مرحباً ، أود أن أعرف كيف يتم التقدم في هذه القضية. الآن ، أنا أستخدم windows 10 home مع docker-toolbox. يبدو أنه خطأ في الغالب عندما أحاول ربط ملف التثبيت كحجم في الحاوية. سيكون من الجيد أن يكون لديك قدرات نسخ في تكوين عامل الإرساء

سيكون بالتأكيد ميزة النسخ / إضافة ميزة مرحب بها.

حالة استخدام: تشغيل مثيل Graylog في Docker لأغراض التطوير. لبدء تشغيل الإدخال تلقائيًا ، يجب وضع مواصفات JSON في / usr / share / graylog / data / contentpacks
مع ميزة نسخ / إضافة ، سيكون الأمر سهلاً مثل سطر واحد في YML.

لكي تعمل الآن (في 16 أكتوبر 2018) ، تحتاج إلى تحميل وحدة تخزين إلى تلك النقطة ونسخ المحتوى الأصلي لهذا المجلد إلى المجلد الثابت. وهو هادئ غير مريح.

سأستفيد من ذلك ، لدي مجموعة من الأدوات التي تستورد بذرة قاعدة البيانات في حاوية ثم أقوم بتشغيل أداة استيراد قاعدة بيانات devtools بناءً على هذا الملف. لا أريد أن أفعل:

docker cp "${seed_file}" $(docker-compose ps -q devtools):/tmp/seed_file

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

سيكون من المنطقي القيام بما يلي:

docker-compose cp "${seed_file}" devtools:/tmp/seed_file

الكل في الكل ، إنها مجرد يد مختصرة تقوم بنفس الشيء بشكل أساسي ، ولكن يبدو أنه من الأفضل الاستفادة من docker-compose كل مكان بدلاً من خلط الأشياء ...

1) يبدو أن هذه نسخة مكررة من # 3593
2) أتفق مع @ shin- أن حالات الاستخدام المفصلة تتبع نمطًا مضادًا
3) لكن اختتام أمر Docker cp أمر منطقي ، imo

funkyfuture إذا كنت تعتقد أن حالات الاستخدام هذه تتبع نمطًا مضادًا ، فالرجاء اقتراح حل لا يفعل ذلك.

ماذا عن "قسم البيانات" مثل k8s ؟
فمثلا:

services:
  service1:
    image: image.name
    data:
      filename1.ini: |
        [foo]
        var1=val1
        [bar]
        var2=val2
      filename2.yml: |
        foo:
          bar: val1

أو ربما نفس الشيء لكن لقسم volumes:

volumes:
  service_config:
    data:
      filename1.ini: |
        [foo]
        var1=val1
        [bar]
        var2=val2

services:
  service1:
    image: image.name
    volumes:
      - service_config:/service/config

@قصبة-

تكمن المشكلة في هذا في أنه قصير النظر بشكل لا يصدق (ومن هنا جاء مصطلح "النمط المضاد") ، حيث سيجبرك على تكرار العملية في كل مرة يتم إعادة إنشاء الحاويات. ناهيك عن حقيقة أن قشورها سيئة للغاية (ماذا لو كان لديك 10 حاويات؟ 20؟ 100؟)

تكمن المشكلة الفعلية هنا في أن بعض الأشخاص يسارعون جدًا في استبعاد الميزات المطلوبة لأنها تتعارض مع رؤيتهم المحدودة لسيناريوهات حالة الاستخدام الفعلي.

أنا هنا أبحث عن طريقة لنسخ ملف التكوين الخاص بي في حاوية حصلت عليها للتو من dockerhub. لا يمكنني الوصول إلى Dockerfile الأصلي وسيكون من الملائم جدًا أن يكون لديك هذه الميزة ، (بدلاً من محاولة بناء طبقة أخرى في الأعلى ، والتي ستعمل ، ولكنها غير مريحة ، لا أريد إعادة البناء عندما أقوم بتغيير شيء ما).

حالة الاستخدام:

أقوم بتشغيل قاعدة بيانات في بيئة اختبار تكامل وأريد إعادة تعيين البيانات في كل تكرار ، عند بدء تشغيل الحاويات. قد ينجح دمج البيانات في صورة مخصصة ، ولكن تحميل وحدة تخزين أمر مرهق - لأنه يجب إعادة تعيين البيانات الموجودة على المضيف.

نحافظ على البيانات بشكل مستقل وسيكون من الأنسب استخدام صورة قاعدة البيانات القياسية فقط - نسخ البيانات إليها قبل أن يبدأ تشغيلها. في الوقت الحالي ، لا يبدو هذا ممكنًا باستخدام عامل إنشاء السفن.

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

راجع للشغل أنا حاليًا أستخدم dockerfiles وتوجيه البناء في docker-compose.yaml للقيام بذلك. سيكون من الرائع لو لم أكن بحاجة إلى ملفات عامل التحميل.

tvedtorama -

حالة الاستخدام:

أقوم بتشغيل قاعدة بيانات في بيئة اختبار تكامل وأريد إعادة تعيين البيانات في كل تكرار ، عند بدء تشغيل الحاويات. قد ينجح دمج البيانات في صورة مخصصة ، ولكن تحميل وحدة تخزين أمر مرهق - لأنه يجب إعادة تعيين البيانات الموجودة على المضيف.

نحافظ على البيانات بشكل مستقل وسيكون من الأنسب استخدام صورة قاعدة البيانات القياسية فقط - نسخ البيانات إليها قبل أن يبدأ تشغيلها. في الوقت الحالي ، لا يبدو هذا ممكنًا باستخدام عامل إنشاء السفن.

تناقش هذه المشكلة الرغبة في نسخ الملفات في وقت إنشاء الصورة ، وليس وقت التشغيل. أود أن أقترح رفع تذكرة منفصلة لمناقشة مزايا ذلك؟ قد يربك هذا النقاش للاستطالة في مناقشة إدخال ملف وقت التشغيل (وهو ما أفسر ما تتحدث عنه.)

@ c0ze -

ماذا عن "قسم البيانات" مثل k8s ؟
فمثلا:

...

لست على دراية كاملة بما يفعله هذا التكوين ، لكن نعم ، يبدو أنه سيكون حلاً. بشكل أساسي عندما يكون لديك أسرار (على سبيل المثال ، ما هو اسم المستخدم / pwd / المنفذ لتسجيل الدخول إلى قاعدة البيانات) ، كيف يمكنني إدخال ذلك في صور عامل الإرساء - العملاء والخوادم - دون كتابة الكثير من التعليمات البرمجية؟

يمكن أن يعمل شيء مثل قسم بيانات kubernetes - لأنه سيكون مصدرًا واحدًا للحقيقة. خلاف ذلك ، قد يجد المرء أن لديهم نفس الأسرار التي تم الاحتفاظ بها عدة مرات عبر صور متعددة لعمال الميناء.

هناك أيضًا حالة فنية سابقة هناك ، مما يساعد على تحريك المحادثة لمعرفة ما إذا كانت هذه فكرة جيدة تستحق التبني أم لا.

بالنسبة لي ، بدأ كل هذا بالرغبة في مشاركة ملف تكوين ثابت عبر الحاويات ، وإدراك أنه لا توجد طريقة للقيام بذلك دون البرمجة النصية خارجيًا لتكوين عامل الإرساء ، وكتابة التكوين من مصدر واحد للحقيقة في كل من مجلدات Docker الموجودة أسفل مجلد إنشاء عامل الإرساء. بالطبع أحصل على حجة الثبات لـ Docker (على سبيل المثال ، دليل Dockerfile يصف بشكل كامل وكامل كيفية بناء الصورة) لذا فإن طلب الأتمتة لنسخ الأشياء في هذا الدليل يبدو أنه يطير قليلاً في مواجهة تلك المبادئ.

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

هذا ليس ذا أهمية كبيرة بالنسبة لي ، لكنني أعتقد أن حالة الاستخدام تستحق المناقشة.

سيكون مفيدا للغاية بالنسبة لي. في العمل ، يمنع برنامج الفيروسات قدرة Windows 10 على مشاركة وحدات التخزين مع الحاويات. إنها مؤسسة ضخمة وليس بداية لجعلها تتغير بسبب سياسة تم وضعها في قارة أخرى.

مرحبًا ، حالة الاستخدام الخاصة بي: أنا أستخدم إعداد إنشاء Prometheus docker-compose مفتوح المصدر (يتم الاحتفاظ الريبو بواسطة أشخاص آخرين). لديها التكوينات التي يتم تركيبها في الحاويات. المشكلة: لا يمكنني إنشاء عامل ميناء على جهاز بعيد (مثل آلة إرساء aws أو داخل عداء CI / CD) لأنه لا يمكنه تحميل التكوينات بشكل صحيح. في هذه الحالة أود نسخها / تضمينها. بالنسبة لبيانات القراءة والكتابة ، توجد أحجام ، بالنسبة لبيانات القراءة فقط -؟

الخيار الآخر هو امتلاك أحجام RO مع إمكانية ضبط البيانات الأولية.

الحل الحالي: الاتصال بمضيف عامل الإرساء عبر ssh ، واستنساخ / تحديث الريبو وتشغيل docker-compose up. يعمل هذا مع الحالة اليدوية ، لكن من الصعب التشغيل الآلي :(

+1

Use-case: لديّ جهاز تطوير يقوم بتشغيل قاعدة بيانات وكلما قمت بإعداده ، أحتاج إلى تفريغ حديث لقاعدة البيانات ليتم تثبيته. هذا يعني على نحو فعال:

  1. سحب صورة عامل إرساء قاعدة البيانات من الخارج.
  2. انسخ واستخرج ملف ZIP في الصورة قيد التشغيل.
  3. تنفيذ استعادة ديسيبل داخل وحدة التخزين.
  4. حذف ديسيبل تفريغ.

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

حالة الاستخدام الخاصة بي بسيطة. لا أريد مجلدات ولا أريد أن ألتقط صورتي الخاصة. أريد فقط وضع نسخة دفاعية بسيطة من ملف التكوين في حاوية بعد إنشائه وقبل أن يبدأ.

هل ما زالت هذه مشكلة؟
لدي تطبيق django مع ملف إعدادات طويل جدًا. بالنسبة لي ، سيكون من الأسهل إنشاء صورة عامل إرساء ونسخ ملف تكوين واحد إلى كل حاوية.
اجتياز جميع الإعدادات مثل ENV بالنسبة لي هو المضاد. يتطلب الكثير من التعليمات البرمجية ، ويصعب الحفاظ عليه ويمكن حله باستخدام أمر نسخة واحدة.

لقد فتحت رقم 6643 وأحب أن أعلق على كيفية اعتباره مضادًا للنمط. على وجه الخصوص ، في بيئة قد تحتاج إلى إضافة / تعديل العديد من ملفات التكوين أثناء التنقل.

@قصبة-

تكمن المشكلة في هذا في أنه قصير النظر بشكل لا يصدق (ومن هنا جاء مصطلح "النمط المضاد") ، حيث سيجبرك على تكرار العملية في كل مرة يتم إعادة إنشاء الحاويات. ناهيك عن حقيقة أن قشورها سيئة للغاية (ماذا لو كان لديك 10 حاويات؟ 20؟ 100؟)

كيف يعمل docker-compose exec مع حاويات متعددة؟

    --index=index     index of the container if there are multiple
                      instances of a service [default: 1]

ألا يجب أن نحاول الحصول على نفس السلوك مع cp ؟

IMHO exec سريع الزوال بقدر ما سيكون cp . لكنني دائمًا أعتبرها أوامر "تطوير" على أي حال ، يجب أن تكون بيئات التطوير سريعة الزوال ، أليس كذلك؟

لم أر التعليق على الكثير من المطورين هنا يقولون إنهم يعانون من قصر النظر من خلال محاولة إصلاح هذا بسرعة كبيرة من خلال طلب هذه الميزة. أعتقد أن هذا قاسٍ ومتعالي بعض الشيء. إذا كان هناك شيء واحد تعلمته من سنوات التطوير ، فهو كالتالي:

ليس ما يفعله برنامجك ، بل ما يفعله المستخدم به هو المهم

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

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

أعتقد أنه يجب أن تزن كلماتك بعناية عند قول أشياء من هذا القبيل ...

  1. لا أحتاج حقًا إلى محاضرة حول ما يُسمح لي بقوله أو كتابته. أنا آسف لأن "قصر النظر" يسيء إليك. لا يزال من الصحيح القول إن هذه الأشياء تنتمي إلى Dockerfile حسب التصميم.
  2. أنا لست مشرفًا بعد الآن. من فضلك توقف عن @ -ing me على الأشياء التي لم يعد لدي أي سيطرة عليها.
  1. يجب أن أقول إنني على جانب المجنون هنا ... إن استبعاد حالات استخدام العالم الحقيقي الصالحة تمامًا باعتبارها "نمطًا مضادًا" ، دون إعطاء بدائل عملية وواقعية مفيدة هو نهج غير ودي للمطور ، وبصراحة تامة حتى وقح بعض الشيء.
  2. مشرف أم لا ، إذا كنت قد شاركت في جزء المناقشة من github ، فعليك أساسًا العيش مع أشخاص يعلقون على تعليقاتك. هذا فقط كيف يعمل. تعامل مع...

دعنا نعيدها. صادقة سؤال تقني هنا. مع عامل الميناء لدينا خيار "التهيئة". هذه ميزة عامل إرساء أصلية ولكنها للخدمات وليس الحاويات. ما جدوى الحصول على شيء من هذا القبيل يعمل على مستوى الحاوية بدلاً من مستوى الخدمة؟ كيف ينفذ عامل ميناء المكدس توفير التكوين؟ هل يمكن تكرار هذا التنفيذ لتكوين عامل ميناء على وجه التحديد؟

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

حالة استخدام بسيطة أخرى هي أشياء مثل التحقق من صحة مجال googles. إذا كنت تستخدم صورة wordpress ، فلن تتمكن من إضافة ملف ستتحقق منه Google. تحتاج إلى إنشاء صورة جديدة كاملة للقيام بذلك.

كما أن هذه التعليقات التي تقول أشياء "مناهضة للنمط" بالكاد تكون منطقية ، تفوح منها رائحة نخبوية.

تحرير: yikes ، اقرأ المزيد ، الحمد لله لم يعد المشرف

لذا فأنت تخبرني أنه إذا كنت أرغب في نسخ ملف تكوين صغير إلى صورة تم إنشاؤها مسبقًا (على سبيل المثال ، nginx أو mariadb ) ، فأنا الآن بحاجة إلى إدارة إعداد إنشاء الصور الخاص بي والتكرار مساحة القرص المستخدمة (الصورة الأصلية والصورة المكونة)؟

يجب أن تكون هذه ميزة.

تكرار مساحة القرص المستخدمة

أنت لا تستخدم Docker.

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

يعجبني كيف تنتقي شيئًا واحدًا مما قاله وهو أصغر شيء في كل ذلك.

يجب الإشارة إلى حجة غير صالحة على هذا النحو.

أعتقد أن الشيء هنا هو أن الحجة "المضادة للنمط" يمكن أن تكون صحيحة بالنظر إلى استراتيجية عمل معينة (انظر نقطة washtubs ). قد لا نتفق مع هذه الإستراتيجية ، لكن هذا لا يبرر الهجمات الشخصية. في النهاية ، جهود @ shin السابقة مع docker-py والتي من شأنها أن تسمح لك بتنفيذ بديل لـ docker-compose .

ما الحجة "المضادة للنمط"؟ لا توجد حجة. إنها مجرد "لا ، لأن ضد النمط" بدون أي منطق وراءها ، فقط قولها دون أي شيء يدعمها. يبدو الأمر كما لو كان الناس يقولون إنه فكروا في أسوأ سيناريو على رؤوسهم ، وقرروا أن السيناريو كان معاديًا للنمط ثم رفضوا كل شيء على هذا النحو دون حتى الكتابة عما يسمى بالسيناريو المضاد للنمط.

إنها مجرد نخبوية. كانت العديد من التعليقات هنا حول مدى سخافة سبب عدم إضافة هذا ويتم تجاهلها جميعًا.

الفطرة السليمة والمنطق لا يهتمان بمشاعرك أو نخبويتك. أو أنماطك المختلقة المضادة.

نعم ، robclancy ، يرجى الاحتفاظ بها مدنية FFS. أريد هذه الميزة ، ولكن إذا كان كل ما ستفعله هو التحدث مع المشرفين ، فانتقل إلى reddit من فضلك. التصحيح السابق لـ funkyfuture مضمون تمامًا.

في النهاية ، جهود @ shin-s السابقة مع docker-py التي من شأنها أن تسمح لك بتنفيذ بديل ل docker-compose.

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

إذا قدم شخص ما إقامة عامة ، فهل سيتم النظر فيه بالفعل؟ أم أن هذا شيء قرر فريق عمال الرصيف بحزم أنهم لن يقبلوه؟ هل سيكون شيئًا ما على غرار إضافة قسم تكوين متوافق مع تكوينات مكدس عامل الإرساء شيئًا

لقد خرج هذا عن المسار ... تحول "النمط المضاد" بدون تفسير "النمط المضاد" إلى تعريف واسع للغاية من المستحيل المجادلة ضده. كما أنه لا يوجد اتجاه واضح على أي جانب يجلس "النمط المضاد" ؛ إنشاء عامل ميناء أو عامل ميناء.

إن التحديد الواضح للردود المضادة للنمط سيكون رائعًا ويحظى بتقدير كبير.

سيستمر المجتمع في النمو لذا يجب أن توجد مجموعة ثابتة من التعريفات.

أريد استخدامه لنسخ القطع الأثرية التي تم إنشاؤها بواسطة خط أنابيب جينكينز الذي يعمل على مكدس تركيب عامل ميناء. وبعد ذلك ، يمكن أن يكون اسم الحاوية عشوائيًا ، لذا لا يمكنني استخدام docker cp .

اليوم يجب أن أستخدم

docker cp $(docker-compose -f docker-compose.development.ci.yml ps -q test):/app/tests_output ./tests_output

هل هذا يختلف عن volumes: - ./folder_on_host/ :/folder_in_container/ ؟
يمكنني نسخ الملفات من مضيف إلى حاوية (ما يعادل النسخ) بهذه الطريقة في ملف الإنشاء الخاص بي

أحاول أن أفعل نفس الشيء. لدي مجلد به ملف csv وأود تقديمه إلى logstash.
كيف أقوم بذلك. أو أي مجلد في الحاوية؟
في الوقت الحالي لدي شيء هذا:
./path/to/storage:/usr/share/logstash/ data: ro

اي اقتراحات تكون مفيده

@ shin- يبلغ عمر هذه التذكرة الآن 1.5 سنة. عندما يخبرك 160 شخصًا أنك مخطئ - ربما تكون كذلك.

ما الذي تحتاجه أيضًا لإقناعك بوجوب تنفيذ ذلك؟

isapir ، الشركات التي لا تستمع إلى عملائها ، تميل إلى الخروج من العمل قريبًا. لذلك أعتقد أننا يجب أن نرى بعض البدائل الجاهزة للإنتاج في المستقبل القريب.

@ shin- يبلغ عمر هذه التذكرة الآن 1.5 سنة. عندما يخبرك 160 شخصًا أنك مخطئ - ربما تكون كذلك.

😆 🤣 💯 🥇 😲 😮

أيضا،

أنا لست مشرفًا بعد الآن. من فضلك توقف عن @ -ing me على الأشياء التي لم يعد لدي أي سيطرة عليها.

sfuerte هناك مشروع صغير اسمه Kubernetes حل محل Docker-Compose بالفعل. أتساءل عما إذا كان هذا سيحدث لو كان الموقف تجاه تعليقات المستخدمين أكثر إيجابية.

نحن بحاجة إلى كلمة طنانة لمواجهة كلماتهم الطنانة. هذا كل ما يمكنهم التعامل معه.

ستكون هذه الميزة بالكامل pro-pattern . يجب أن تفعل ذلك. الفرق هو أنه على الرغم من أنني قمت بهذا الشيء الغبي ، إلا أن هناك العديد من التعليقات في هذا العدد توضح مزايا هذا بطرق من الواضح أنها حالات استخدام شائعة. ولا يوجد مثيل واحد لـ anti-pattern .

@ shin- لقد تم وضع علامة عليك في هذا لأنك بدأت هذا الهراء المضاد لنمط الهراء بدون أساس في الواقع. لذا توقف عن البكاء على شيء تسبب فيه.

ك المتعة

حالتي هي:

  • أثناء "dev" ، أريد أن يكون كود المصدر الخاص بي مبنيًا على أنه "حجم" بحيث يتم تحديثه تلقائيًا أثناء التطوير
  • عندما يكون التطبيق جاهزًا للإصدار وأحتاج إلى "النشر" ، أريد نسخ الملفات المنسوخة بدلاً من أن تكون مجلدات.

أعتقد أن أسهل طريقة لحل هذه المشكلة هي أن يكون لديك ملف إنشاء واحد لـ dev وملف إنشاء واحد للإنتاج.

المشكلة هنا هي أنه يمكنني تحديد "مجلدات" في ملف عامل التحميل ، لكن لا يمكنني تحديد "نسخ" في ملف عامل الإرساء؟

هل يوجد أحد في نفس حالتي؟ هل فاتني شيء؟

@ شين - هل هذا مضاد للنمط؟ كيف ستشرع في حل هذه المشكلة؟

hems ، في عالم مثالي ، تريد أن يتم نشر تطبيقك كصورة عامل إرساء مستقل. لذا ، إذا كنت تكتب تطبيقًا ، فمن المحتمل أن تكون شفرة المصدر التي تنوي نشرها جزءًا من Dockerfile ، لذا تحتوي الصورة على التطبيق بأكمله. لذلك في Dockerfile ، إذا كنت تريد مصدرك في / var / www ، فستضعه

COPY my-app-src /var/www

مصدرك ليس خاصًا بالبيئة لذا فهو ينتمي فقط إلى صورة عامل ميناء سهل.

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

هل يمكن لشخص ما من فريق عمل عمال الرصيف إلقاء نظرة جادة ونزيهة على هذا الأمر وإصدار حكم نهائي (نأمل أن يتجاهل جميع الأشخاص غير الناضجين)؟ هذه القضية كانت مفتوحة إلى الأبد. النتيجة مهمة ، لكنني شخصيًا تعبت من تلقي الإشعارات.

COPY my-app-src /var/www

هذا ما أقوله ، أثناء التطوير ، أريد استخدام ملف إنشاء عامل الإرساء الخاص بي لتركيب وحدات التخزين في الصور وأثناء إنشاء الإنتاج ، أريد نسخ الملفات إلى الصور ، ولهذا السبب أعتقد أنه يجب أن نكون قادرين على نسخ وحدات التخزين وتركيبها باستخدام ملف docker-compose ، لذا يمكنني الحصول على ملف إنشاء واحد لـ dev و 1 لبناء الإنتاج.

أنا أعمل ضمن الفريق الذي يتولى خدمة "إنشاء" ويسعدني الانتقال إلى هذه المناقشة. للبدء ، سأوضح كيف نرى مسؤوليات Dockerfiles و Compose files.

Dockerfiles هي وصفة لإنشاء الصور ويجب أن تضيف جميع الثنائيات / الملفات الأخرى التي تحتاجها لجعل خدمتك تعمل. هناك استثناءان لهذا: الأسرار (على سبيل المثال: بيانات الاعتماد) ، التكوينات (أي: ملفات التكوين) ، وبيانات حالة التطبيق (على سبيل المثال: بيانات قاعدة البيانات الخاصة بك). لاحظ أن الأسرار والتكوينات للقراءة فقط.

تُستخدم ملفات الإنشاء لوصف كيفية نشر مجموعة من الخدمات وتفاعلها. لا يتم استخدام تنسيق Compose لمحرك واحد فقط (على سبيل المثال: docker-compose ) ولكن أيضًا للبيئات المنسقة مثل Swarm و Kubernetes. الهدف من تنسيق Compose هو تسهيل كتابة تطبيق واختباره محليًا ، ثم نشره في بيئة منسقة مع القليل من التغييرات أو بدون تغييرات. يحد هذا الهدف مما يمكننا تغييره في التنسيق بسبب الاختلافات الأساسية مثل كيفية تعامل كل بيئة مع الأحجام وتخزين البيانات.

إن تقسيم مسؤوليات ملف Dockerfile و Compose مثل هذا يعطينا فصلًا جيدًا عن المخاوف: ماذا يوجد في كل صورة حاوية (Dockerfile) ، وكيف يتم نشر الخدمات وتفاعلها (إنشاء ملف).

سأمر الآن في كل استثناءات لما تخزنه في صورة ما. بالنسبة للأسرار ، لا تريد تحويها في صور لأنها يمكن أن تتم سرقتها ولأنها قد تتغير بمرور الوقت. يتم استخدام Docker Secrets لحل هذا الأمر. تعمل هذه بشكل مختلف قليلاً اعتمادًا على البيئة التي تنشر فيها ولكن الفكرة الأساسية هي أنه يمكنك تخزين بيانات الاعتماد في ملف سيتم تحميله للقراءة فقط إلى دليل tmpfs في الحاوية في وقت التشغيل. لاحظ أن هذا الدليل سيكون دائمًا /run/secrets/ وسيكون الملف هو اسم السر. يتم دعم الأسرار على Swarm والمحرك فقط ( docker-compose ) و Kubernetes.

لملفات التكوين أو بيانات التمهيد ، هناك Docker Configs . هذه تعمل بشكل مشابه للأسرار ولكن يمكن تركيبها في أي مكان. هذه مدعومة من قبل Swarm و Kubernetes ، ولكن ليس بواسطة docker-compose . أعتقد أننا يجب أن نضيف دعمًا لها وسيساعد ذلك في بعض حالات الاستخدام المدرجة في هذه المشكلة.

أخيرًا ، هناك بيانات حالة التطبيق التي يجب تخزينها خارجيًا. لن أتعمق في هذا الأمر لأنه لا علاقة له بهذه المشكلة.

بهذا الإطار يمكنني الإجابة عن سؤالين:

  • هل سنضيف حقل copy إلى تنسيق Compose؟ لا ، لا أعتقد أننا سنفعل ذلك لأنه لا معنى له في البيئات المنسقة.
  • هل سنضيف دعم configs إلى docker-compose ؟ نعم ، أعتقد أنه ينبغي علينا ذلك.
  • هل سنضيف docker-compose cp ؟ ربما ، لست متأكدًا من هذا بعد. سيكون في الأساس اسمًا مستعارًا لـ docker container cp .

بالنظر إلى ذلك ، هناك عدة أدوات يمكن استخدامها هنا:

  • تصميمات متعددة المراحل تسمح لك بإضافة ملفات مشروطة إلى صورة باستخدام الأهداف.
  • الأسرار التي تسمح لك بتمرير بيانات الاعتماد إلى خدمة في وقت التشغيل.
  • Configs التي تسمح لك بتمرير معلومات التكوين إلى خدمة في وقت التشغيل.

أعتقد أن هذه الأدوات تحل جميع المشاكل التي أثيرت في هذا الموضوع.

هذا الخيط يسخن تمامًا. يرجى تذكر أن هناك شخصًا حيًا حقيقيًا وراء كل مقبض GitHub وأنهم ربما يحاولون بذل قصارى جهدهم (حتى لو ظهر إحباطهم). نحن جميعًا متحمسون لـ Compose ونريد أن يستمر المشروع في الازدهار.

هل سنضيف docker-compose cp ؟ ربما ، لست متأكدًا من هذا بعد.

سأجد أن هذا ملائمًا مفيدًا مثل docker-compose exec .

@ كريس كرون استجابة مذهلة ، شكرا لك!

أعلم أنني لا أتحدث نيابة عن الجميع ، لكن لدي انطباع بأن الدعم configs يرضي الغالبية العظمى من الاهتمام هنا. يجب فتح قضية لهذا؟

وشكرًا على تقديم بعض الأساليب البديلة. لم أكن أعرف عن الإنشاءات متعددة المراحل حتى الآن.

لدي انطباع بأن الدعم configs يلبي الغالبية العظمى من الاهتمام هنا.

أشك في هذا لأنني أظن أن الغالبية هنا لا تستخدم Swarm و afaik ، تتطلب وظيفة config ذلك.

نعم ، مطلوب Swarm حاليًا ، ولكن من تعليق @ chris-crone ...

يتم دعم هذه بواسطة Swarm و Kubernetes ، ولكن ليس بواسطة عامل إنشاء السفن. أعتقد أننا يجب أن نضيف دعمًا لها وسيساعد ذلك في بعض حالات الاستخدام المدرجة في هذه المشكلة.

... أقرأ أن هذا يمكن تنفيذه في docker-compose (sans Swarm)

الهدف من تنسيق Compose هو تسهيل كتابة تطبيق واختباره محليًا ، ثم نشره في بيئة منسقة مع القليل من التغييرات أو بدون تغييرات.

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

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

https://github.com/docker/compose/issues/6643

احصل على الاختراق باستخدامه .. وسّع وظائف وحدة التخزين حيث يتم ربط كل ملف تحت المفتاح الجديد ديناميكيًا بوحدة تخزين فردية وتعيينها إلى المسارات الداخلية الخاصة بكل منها ...

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

والثاني يتعلق بإنتاج الصور حيث تخبز كود المصدر الخاص بك
(في حال كنت تعمل مع نصوص غير مجمعة) في صورتك (و
ثم مرة أخرى ، لم أكن كذلك ، كنت لا أزال أقوم بتثبيته من جانبي) أو أنت فقط
قم بتجميع طلبك وانسخه في الصورة النهائية. في تلك النقطة،
يصبح التطبيق محمولة للغاية.

أعتقد أن الجميع يفهم ذلك! السؤال هو ، هل يؤلف عامل الميناء
استغرق dev الوقت لقراءة الحالات وفهم الاحتياجات؟ هناك
لا توجد أنماط مضادة هنا من الناحية النظرية ، فقط المطورين الذين يحتاجون ويرغبون
لكى يكون محترما.

نحن نحب عامل الإرساء والتركيب وكل النظام البيئي ، ونستخدمه لأننا
أحبها ولأننا نستخدمها ، فلديك وظائف (على الأقل يدفع البعض منكم
لذلك آمل).

شيء تعلمته في السنوات الأخيرة وأود أن أحضره هنا و
هناك ما يلي وهو ينطبق جيدًا على هذا السيناريو:

ليس ما يفعله برنامجك هو المهم ، بل ما يفعله المستخدمون
مع ما يهم

هتاف واستمرارية سعيدة!

في الخميس ، 6 يونيو 2019 الساعة 10:55 ، كتب jadon1979 [email protected] :

الهدف من تنسيق Compose هو تسهيل كتابة تطبيق
واختبرها محليًا ، ثم انشرها في بيئة منسقة باستخدام
تغييرات طفيفة أو معدومة.

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

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

6643 https://github.com/docker/compose/issues/6643

احصل على الاختراق باستخدامه .. قم بتوسيع وظائف الحجم حيث يكون كل ملف تحت
مفتاح جديد مرتبط ديناميكيًا بوحدة تخزين فردية وتعيينها إلى ملفات
المسارات الداخلية الخاصة بكل منها ...

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/docker/compose/issues/5523؟email_source=notifications&email_token=ABBR3OMQH62242SM4QN5Y7TPZEQP7A5CNFSM4EKAVONKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ABBR3OMOZFZ47L6ITHPF2TDPZEQP7ANCNFSM4EKAVONA
.

أرغب في تدوير بيئة Tomcat لرسو السفن لتشغيل تطبيقي من ملف .war غير مسمى ROOT.war . للقيام بذلك ، لا بد لي من نسخه إلى Tomcat webapps dir وإعادة تسميته إلى ROOT بحيث يتم تشغيله على المنافذ المرتبطة حاليًا 8005/9. فشل أي شيء آخر بسبب مشكلات إعادة الربط على المنافذ مع وجود أخطاء حول "الوصول غير القانوني". هذه اختبارات سريعة الزوال لذلك لا يمكن وضعها في Dockerfile. هذا هو السبب في أنني أريده في docker-compose

washtubs

أعلم أنني لا أتحدث نيابة عن الجميع ، لكن لدي انطباع بأن تكوين الدعم يرضي الغالبية العظمى من الاهتمام هنا. يجب فتح قضية لهذا؟

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

تضمين التغريدة

... أقرأ أن هذا يمكن تنفيذه في docker-compose (sans Swarm)

لدينا بالفعل دعم سري بدائي ويمكن تنفيذ التكوينات بطريقة مماثلة.

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

ما تريده هو وعاء تم إنشاؤه مرة واحدة ، ويفضل أن يكون رسميًا) وقابل للتكوين لحالة الاستخدام ، عند نقطة الاستخدام ، على سبيل المثال docker-compose.

بقدر ما أستطيع أن أرى ما لا يدركه عمال الرصيف هو أن "Dockerfile" هو أكبر مضاد في مفهوم عامل الرصيف بأكمله ، خاصة وأن الأمر برمته غير قابل للقراءة تمامًا ولا يمكن الحفاظ عليه. إنه يجعلني أضحك حقًا عندما يرمي أي شخص متصل بالعاملين كلمة "antipattern" كما لو كانوا يعرفون!

يمنع Dockerfile في الواقع التصحيح العادي والترتيب الذي سيكون متاحًا إذا استخدمت نصًا برمجيًا للبناء ، أو شيء مصمم بالفعل لبناء الأشياء ، مثل ... مدير الحزم ، أو صنع.

بالنسبة لي ، أستخدم نفس DockerFile لجميع حالات الاستخدام (مما يجعله نمطًا!) مما يوحي بأنني أذهب وأغير DockerFile الخاص بي لكل استخدام مختلف ، وهو حقًا مضاد للنمط.

وليس هناك "دعم التهيئة" لا يقطعها على الإطلاق ، ويفرض الهيكل حيث ليست هناك حاجة فقط.

تكمن المشكلة الأساسية في أنك إذا ربطت mount بالقول / etc / nginx ، فيجب أن تكون rw للسماح بتشغيل البرامج النصية التي تضبط التكوينات (ويعرف أيضًا باسم envsubst). وهذا يؤدي بعد ذلك إلى إجراء تغييرات على تكوين الإدخال (الذي يجب أن يظل غير قابل للتغيير) ... لا تحصل على المزيد من الأنماط المضادة من الحاوية التي تكتب في جميع تكويناتها ، لذا فإن خيار نسخ الملفات إلى الحاوية في وقت إعادة الإنشاء ضروري المحلول.

بمعنى آخر ، إنه دليل ربط rw في الحاوية ، ولكنه ro على المضيف. على محمل الجد سوف يقتلك إذا سمحت بذلك؟

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

ما تريده هو وعاء تم إنشاؤه مرة واحدة ، ويفضل أن يكون رسميًا) وقابل للتكوين لحالة الاستخدام ، عند نقطة الاستخدام ، على سبيل المثال docker-compose.

بقدر ما أستطيع أن أرى ما لا يدركه عمال الرصيف هو أن "Dockerfile" هو أكبر مضاد في مفهوم عامل الرصيف بأكمله ، خاصة وأن الأمر برمته غير قابل للقراءة تمامًا ولا يمكن الحفاظ عليه. إنه يجعلني أضحك حقًا عندما يرمي أي شخص متصل بالعاملين كلمة "antipattern" كما لو كانوا يعرفون!

يمنع Dockerfile في الواقع التصحيح العادي والترتيب الذي سيكون متاحًا إذا استخدمت نصًا برمجيًا للبناء ، أو شيء مصمم بالفعل لبناء الأشياء ، مثل ... مدير الحزم ، أو صنع.

بالنسبة لي ، أستخدم نفس DockerFile لجميع حالات الاستخدام (مما يجعله نمطًا!) مما يوحي بأنني أذهب وأغير DockerFile الخاص بي لكل استخدام مختلف ، وهو حقًا مضاد للنمط.

وليس هناك "دعم التهيئة" لا يقطعها على الإطلاق ، ويفرض الهيكل حيث ليست هناك حاجة فقط.

تكمن المشكلة الأساسية في أنك إذا ربطت mount بالقول / etc / nginx ، فيجب أن تكون rw للسماح بتشغيل البرامج النصية التي تضبط التكوينات (ويعرف أيضًا باسم envsubst). وهذا يؤدي بعد ذلك إلى إجراء تغييرات على تكوين الإدخال (الذي يجب أن يظل غير قابل للتغيير) ... لا تحصل على المزيد من الأنماط المضادة من الحاوية التي تكتب في جميع تكويناتها ، لذا فإن خيار نسخ الملفات إلى الحاوية في وقت إعادة الإنشاء ضروري المحلول.

بمعنى آخر ، إنه دليل ربط rw في الحاوية ، ولكنه ro على المضيف. على محمل الجد سوف يقتلك إذا سمحت بذلك؟

شيء من هذا القبيل:

""

إذا كان الملف ثم الكتابة

إذا قام الدليل بالكتابة فوق / إلحاق محتويات الوجهة

بمحتويات من المصدر للحفاظ على بنية الوجهة الأصلية

المصدر: الملف : p ermission: المالك : المجموعة

svc:
نسخ:
- "./source/filename:/path/ filename: ro : www-data"
- './source/dir:/path/ dir: ro : www-data'

# أو
svc:
نسخ:
- المصدر: "./source/file"
الوجهة: "/ الوجهة"
الإذن: ريال عماني
المالك: المالك
المجموعة: المجموعة
- المصدر: "./source/directory"
الوجهة: "/ الوجهة"
الإذن: ريال عماني
المالك: المالك
المجموعة: المجموعة ```

حالة الاستخدام: لدينا حل حاوية غير منظم حيث لدينا ملفات إنشاء عامل تشغيل تطبيقنا بما في ذلك. شهادات SSL وما إلى ذلك داخل مستودع Git وسحبها إلى VM. ثم نقوم بتدوير الخدمة ونريد نقل شهادات SSL وملفات التكوين وما إلى ذلك إلى وحدة تخزين الحاوية. هذا غير ممكن حاليًا بدون Dockerfile المصاحب مع أمر COPY المميز. لا نريد العبث بالملفات الموجودة داخل git repo المستنسخة. إذا كان التطبيق سيغير الملفات ، فسنضطر إلى تنظيف الريبو في كل مرة.

MartinMajewski ثم يمكنك تحميل الدليل مع الشهادات كمجلد وتوجيهه في تكوين التطبيق.

حالة الاستخدام (وسؤال الكيفية مرة واحدة):
لدي صورة postgres مع متغير بيئة واحد يجب تعيينه في البداية: POSTGRES_PASSWORD . أريد ضبطه عبر Docker Secret. ما علي فعله هو وضع entrypoint.sh والذي سيقوم بتصدير Secret المرفق إلى env var من الحاوية قيد التشغيل. أحتاج إلى إضافة نقطة الدخول هذه بطريقة ما إلى الحاوية الخاصة بي عند الإطلاق. بدون Dockerbuild من سطرين - لا أستطيع. نسخة من ملف واحد - لا يمكن القيام بذلك.

مثال على ذلك PS postgres . افترض أنه لا يدعم _FILE env vars.

مشكلة التتبع الداخلي https://docker.atlassian.net/browse/COMPOSE-89

حالة الاستخدام: Karaf
باستخدام صورة karaf الأساسية التي لا أريد إعادة بنائها في كل مرة أقوم فيها ببناء مشروعي ، أريد أن أكون قادرًا على نشر تطبيقي بسرعة وإعادة بناء الحاوية لكل بناء. ومع ذلك ، أحتاج إلى نسخ _features.xml_ و _jar_ في دليل النشر عند بدء تشغيل الحاوية.

كان الحل الذي كنت أقوم به حتى الآن هو استخدام صورة karaf كصورة أساسية في ملف Dockerfile آخر (بالاعتماد على التراكبات - التي تنفد من التراكبات في النهاية ، مما يؤدي إلى حذف يدوي للصورة) و avast / gradle-docker-compose-plugin. بينما يمكن بالتأكيد تمرير أوامر init كمتغير بيئة ، فإن محتويات features.xml لا يمكنها ذلك. يجب أن يتم تخزينه كملف في مكان معين في الحاوية. في الوقت الحالي ، يمكنني فقط استخدام وحدة ربط وحدة التخزين للقيام بذلك. كيف يمكنني إدخال الأشياء إلى هذا الحجم على جهاز بعيد؟ أحتاج إلى المزيد من المنطق في نصي للبناء (مثل org.hidetake.groovy.ssh ، مما يعقد أيضًا نص الإنشاء باستخدام كلمة مرور سرية / منطق مفتاح). إذا كان docker-compose cp متاحًا ، يمكنني فقط إضافة أمر النسخ الضروري إلى docker-compose.yml. سيتولى أفاست / gradle-docker-compose-plugin بناء الحاوية ونسخ الملفات من مخرجات البناء مباشرة إلى الحاوية دون أي منطق وصول إضافي لنظام الملفات عن بعد.

تتم إضافة ملف Dockerfile هذا إلى جزء إنشاء docker-compose.yml الخاص بي من البرنامج النصي. إذا كان هناك أي شيء ، فهو مضاد ، لأنه يضيف فقط تراكبات إلى صورة عامل الإرساء في المنبع مع كل بناء (حتى أجبر على حذف الصورة يدويًا - مما يجعل الإنشاءات أبطأ بكثير).

FROM myregistry:443/docker/image/karaf-el7:latest

COPY karafinitcommands /usr/local/karaf/etc/

COPY features.xml \
     *.jar \
     /usr/local/karaf/deploy/

أجد أنه من المحبط أن يعمل docker cp بشكل جيد لنسخ وقت التشغيل ، لكن docker-compose ليس له آلية مكافئة.

اعتقدت أن الفكرة هي ربط دليل محلي بـ / usr / local / karaf / نشر وإسقاط ملفاتك هناك. لا أتوقع أن أضطر إلى إعادة بناء الصورة أو استخدام ملف عامل إرساء لتحقيق ذلك.

اعتقدت أن الفكرة هي ربط دليل محلي بـ / usr / local / karaf / نشر وإسقاط ملفاتك هناك. لا أتوقع أن أضطر إلى إعادة بناء الصورة أو استخدام ملف عامل إرساء لتحقيق ذلك.

من المؤكد أنه يمكن تحقيقه بهذه الطريقة. أعد قراءة ولاحظ أن هذه مشكلة ملائمة تمامًا: تتم إعادة بناء الحاوية بواسطة gradle build ، الخطوة المنطقية التالية هي: كيف يمكنني نقل ملفات الإنشاء الجديدة إلى "الدليل المحلي" المركب في / usr / local / karaf / publish؟ في حالتي ، "الدليل المحلي" هو "دليل مضيف" بدقة أكبر حيث يكون المضيف مضيفًا بعيدًا. لذلك يجب علي إضافة rsync أو أي شيء آخر إلى البرنامج النصي الخاص بالبناء فقط للحصول على الملفات هناك والتأكد من استبدال الملفات القديمة وإزالة الملفات الإضافية. سيكون من غير الضروري إذا كان docker-compose cp متاحًا. يمكنني استخدام عميل عامل الإرساء الحالي الخاص بي في اتصال docker daemon ، والذي قمت بإعداده عبر إعادة توجيه المنفذ.

يمكن إزالة أحجام Docker مع كل بناء. لا يمكن ربط مجلدات التحميل. سيتم إعادة توطينهم فقط إذا كانوا فارغين (آلية حماية الثبات). بالطبع ، يتطلب إفراغ قاعدة ربط على جهاز بعيد أذونات معينة ومنطق وصول يمكن تجنبه جميعًا باستخدام docker-compose cp.

مرة أخرى ، يمكن تحقيق نسخة في بيئة وقت التشغيل باستخدام docker cp. هذا هو الجزء المحبط.

آه ، حسنًا ، أنا معتاد جدًا على الإعداد الخاص بي. أستخدم http://github.com/keithy/groan نصًا برمجيًا bash يقوم تلقائيًا بنشر البتات والقطع على الخوادم البعيدة ، ثم نستدعي عامل الإرساء.

حالة الاستخدام: جوجل سحابة بناء وبناء القطع الأثرية

الأداة المطلوبة: عميل الويب (تم إنشاؤه تلقائيًا) يتفاعل مع ارتباطات الرسم البياني. أنت بحاجة إلى تشغيل الخادم لإنشاء الملفات المطلوبة لتجميع العميل. تحتوي صورة العميل على الأدوات اللازمة لإنشاء الروابط ، مع إعطاء عنوان الخادم. لذلك تبدأ صورة الخادم في الخلفية ، وتحتاج الآن إلى تشغيل حاوية العميل التي تشير إلى الخادم. الآن كيف يتم إخراج الملفات التي تم إنشاؤها من الحاوية ، وإلى الدليل المضيف "مساحة العمل"؟ لا يُسمح بتركيب الأدلة ، نظرًا لأنك موجود بالفعل في دليل مُحمّل في حاوية عامل إرساء. القدرة على docker-compose cp ستخفف من الخطوة المؤلمة الإضافية للحصول على معرف الحاوية.

الاعتماد على $(docker-compose ps -q SERVICE) لاستهداف الحاوية المناسبة يجعل من الممكن استخدام docker cli العادي لمثل هذه العمليات التي تتمحور حول الحاوية. من المؤكد أن تقديم أمر جديد سيجعل الأمر أكثر بساطة بالنسبة لعدد قليل من حالات الاستخدام التي تطلب ذلك ، ولكنه ليس مطلوبًا. لتجنب المزيد من الازدواجية في الكود بين الإنشاء و docker CLI ، أعتقد أنه يجب إغلاق هذه المشكلة.

هناك مشكلة مفتوحة حيث تختلف ذاكرة التخزين المؤقت للبناء بين الإنشاء و docker العادي ، نظرًا لاستخدام إصدار docker daemon compose ، مما يعني أنك بحاجة إلى استخدام تكوين خالص لعدم كسر ذاكرة التخزين المؤقت في بيئات CI (https: // github .com / docker / compose / issues / 883) لذلك حتى يتم حل هذه المشكلات ، فإن مزج أوامر عامل التحميل العادي مع أوامر الإنشاء يكسر ذاكرات التخزين المؤقت. يحدد تكوين التكوين جميع أنواع المخبوزات في التكوين ، مما يخفف من الحاجة إلى تحديد التكوين المكرر يدويًا باستخدام أوامر docker العادية.

الاعتماد على $(docker-compose ps -q SERVICE) لاستهداف الحاوية المناسبة يجعل من الممكن استخدام docker cli العادي لمثل هذه العمليات التي تتمحور حول الحاوية. من المؤكد أن تقديم أمر جديد سيجعل الأمر أكثر بساطة بالنسبة لعدد قليل من حالات الاستخدام التي تطلب ذلك ، ولكنه ليس مطلوبًا. لتجنب المزيد من الازدواجية في الكود بين الإنشاء و docker CLI ، أعتقد أنه يجب إغلاق هذه المشكلة.

يذهب هذا إلى أعمق بكثير من "حالات استخدام قليلة مذكورة" لأن هذه السيناريوهات شائعة إلى حد ما والتعديل ، وبناء الصورة ، والتعديل مرة أخرى ، وبناء الصورة ، وما إلى ذلك هي آيات بالوقت تكون قادرة على التعامل مع هذه الأشياء من خلال تكوين عامل الميناء. إن حجة "يمكنك القيام بذلك في docker cli لذا افعلها هناك" إلى حد كبير تلغي العديد من الأشياء الأخرى التي تمت إضافتها إلى docker-compose.

تم فتح هذا العدد لمدة عام تقريبًا وهناك العديد من المناقشات الأخرى حوله خارج هذه القضية. بالتأكيد لا ينبغي إغلاقها ما لم يتم حلها بالفعل.

يحتاجdionjwa # 883 حقًا إلى التحقيق (إذا كان لا يزال مناسبًا) حيث يجب محاذاة عامل الإرساء مع عامل الإرساء CLI.

@ jadon1979 أنا لا أحاول حظر طلب الميزة هذا ، لقد لاحظت للتو أنه قد تم فتحه منذ أكثر من عام ، ولم يعتبره أي من
أنا أقول فقط أنه وفقًا للتعليقات على طلب الميزة هذا ، ونقص جهود التطوير لتقديم "طريقة أفضل" ، فإن الحل المقترح لاستخدام مزيج من docker-compose و docker cli ، والذي يمكنك تسميته بسهولة البيئة الخاصة بك لجعلها سهلة الاستخدام ، هو حل معقول.
الآن ، إذا فتح أحد الأشخاص PR لتقديم أمر cp ، فسيسعدني مراجعته.

لم يساهم أحد لأنه تم إخبار الجميع بأن كل حالة استخدام هي ملف
مكافحة النمط. وكل بضعة أيام ، يتم نشر حالات استخدام جديدة ، لا شيء
مكافحة الأنماط.

يوم الاثنين 18 نوفمبر 2019 الساعة 5:31 مساءً Nicolas De loof [email protected]
كتب:

dionjwa https://github.com/dionjwa # 883
https://github.com/docker/compose/issues/883 يجب أن تكون كذلك
تم التحقيق (إذا كان لا يزال مناسبًا) حيث يجب مواءمة تكوين عامل الإرساء مع
عامل ميناء CLI.

@ jadon1979 https://github.com/jadon1979 أنا لا أحاول منع هذا
طلب ميزة ، لقد لاحظت للتو أنه تم فتحه منذ أكثر من عام واحد ، و
لم يعتبر أي من المشرفين الأساسيين أنه مهم بما يكفي لـ
أدخل أمرًا جديدًا ، ولم يقترح أحد المساهمين علاقة عامة له.
أنا فقط أقول أنه وفقًا للتعليقات على طلب الميزة هذا ،
ونقص جهود التنمية لتقديم "طريقة أفضل" المقترحة
الحل لاستخدام مزيج من docker-compose و docker cli ، والذي يمكنك
يمكن بسهولة الاسم المستعار في بيئتك لجعلها سهلة الاستخدام ، هو
حل معقول.
الآن ، إذا قام شخص ما بفتح العلاقات العامة لتقديم أمر cp جديد ، فسأكون سعيدًا بذلك
راجعه.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/docker/compose/issues/5523؟
أو إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/AAGRIFY7CULCUS3TDDTTHZLQUL3TZANCNFSM4EKAVONA
.

حالة الاستخدام الخاصة بي لا تنسخ أشياء _ في_ حاوية ، إنها تنسخها _ خارج الحاوية بعد تشغيلها. يمكن القيام بذلك من واجهة سطر الأوامر (CLI) باستخدام حل بديل غير مكتمل ينتج عنه وظائف متدهورة يمكن القول . التفاصيل الكاملة أدناه.

أنا مهندس DevOps ، وأعتمد بشدة على الحاويات كبديل لجحيم التبعية لوكلاء البناء المعدني. عندما يختبر نظام CI الخاص بي الريبو ، فإنه يبدأ بالبناء من Dockerfile داخل نفس الريبو ، وتشغيل جميع الشيكات ( bundle exec rspec ، npm test ، إلخ) _ داخل الحاوية_. إذا كانت هناك عناصر إنشاء تم إنشاؤها مثل التوثيق أو نتائج الاختبار ، فأنا ببساطة أنسخها من الحاوية باستخدام docker cp .

بالنسبة لاختبارات التكامل ، بدأنا في استخدام docker-compose لتوفير تبعيات الخدمة (مثل خادم قاعدة البيانات) للحاوية التي تشغل الاختبارات. لسوء الحظ ، يكون "حل docker CLI" أقل فائدة في هذه الحالة لنسخ الملفات.

ضع في اعتبارك هذا التكوين: docker-compose-minimal.yml

version: "3"
services:
  artifact-generator:
    image: busybox

سأقوم بإنشاء الحاوية ، وتشغيل أمر في تلك الحاوية ، والحصول على معرف الحاوية ، ومحاولة استخراج الملف باستخدام docker cp

$ # Prepare the images and (stopped) containers.  In this case there is only one.
$ docker-compose --file docker-compose-minimal.yml up --no-start
Creating network "docker-compose-cp-test_default" with the default driver
Creating docker-compose-cp-test_artifact-generator_1 ... done
$ # Determine the ID of the container we will want to extract the file from
$ docker-compose --file docker-compose-minimal.yml ps -q artifact-generator
050753da4b0a4007d2bd3514a3b56a08235921880a2274dd6fa0ee1ed315ff88
$ # Generate the artifact in the container
$ docker-compose --file docker-compose-minimal.yml run artifact-generator touch hello.txt
$ # Check that container ID again, just to be sure
$ docker-compose --file docker-compose-minimal.yml ps -q artifact-generator
050753da4b0a4007d2bd3514a3b56a08235921880a2274dd6fa0ee1ed315ff88
$ # OK, that looks like the only answer we're going to get.  Can we use that to copy files?
$ docker cp $(docker-compose --file docker-compose-minimal.yml ps -q artifact-generator):hello.txt ./hello-artifact.txt
Error: No such container:path: 050753da4b0a4007d2bd3514a3b56a08235921880a2274dd6fa0ee1ed315ff88:hello.txt
$ # Nope.  Let's take a look at why this is
$ docker container ls -a
CONTAINER ID        IMAGE                        COMMAND                   CREATED              STATUS                          PORTS               NAMES
9e2cb5d38ba0        busybox                      "touch hello.txt"         About a minute ago   Exited (0) About a minute ago                       docker-compose-cp-test_artifact-generator_run_dd548ee686eb
050753da4b0a        busybox                      "sh"                      2 minutes ago        Created                                             docker-compose-cp-test_artifact-generator_1

كما ترى ، فإن docker-compose ps ليس لديه حقًا أي معرفة بمعرف الحاوية المحدث. وهذا أمر مؤسف. لن يكون هذا سيئًا للغاية إذا كانت هناك طريقة بالنسبة لي لمعرفة أن run_dd548ee686eb كان مرتبطًا بطريقة أو بأخرى بـ docker-compose run الذي نفذته ، لكنني لا أرى طريقة لتحقيق ذلك.

هناك حل بديل لهذا الحل البديل ، وهو إضافة --name إلى أمر التشغيل:

$ docker-compose --file docker-compose-minimal.yml run --name blarg artifact-generator touch hello.txt
$ docker cp blarg:hello.txt ./hello-artifact.txt
$ ls 
docker-compose-minimal.yml  hello-artifact.txt

نجاح! ... كيندا

تكمن المشكلة هنا في أنه إذا كان لدي العديد من الإصدارات التي تعمل بالتوازي ، فأنا بحاجة إلى تحمل مشكلة جعل --name s فريدًا عالميًا. خلاف ذلك ، سأحصل على تصادمات صاخبة في أفضل الحالات ونتائج تالفة (لا يوجد خطأ ، ولكن ملف خاطئ مستخرج) في أسوأ الحالات. هذا أمر صعب لأنني الآن مضطر إلى إعادة اختراع إنشاء معرف الحاوية بدلاً من مجرد استخدام الذي أنشأه Docker بالفعل.

كحد أدنى ، أرغب في طريقة ما لمعرفة معرف الحاوية الذي ينتج عن الأمر docker-compose run .

تضمين التغريدة

الاعتماد على $ (docker-compose ps -q SERVICE) لاستهداف الحاوية المناسبة يجعل من الممكن استخدام docker cli لمثل هذه العمليات التي تتمحور حول الحاوية.

خطأ ، انظر الشرح في التعليق السابق.

سيكون لدينا حالات استخدام جديدة لسنوات هنا. انتظر يعني معاد جديد
أنماط - رسم...

على جمعة، 13 ديسمبر 2019، 11:40 إيان، [email protected] كتب:

ndeloof https://github.com/ndeloof

الاعتماد على $ (docker-compose ps -q SERVICE) لاستهداف الحاوية الصحيحة
اجعل من الممكن استخدام docker cli العادي لمثل هذه الحاوية المركزية
عمليات.

خطأ ، انظر الشرح في التعليق السابق.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/docker/compose/issues/5523؟
أو إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/AAGRIF3S4UHF5NG3VKYXJB3QYONHLANCNFSM4EKAVONA
.

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

يؤدي نشرنا إلى إنشاء صورة Docker باستخدام bazel ، وتحميلها إلى Docker Registry ، ثم استخدام موارد Terraform docker_container مع مقاطع upload لنسخ ملفات التكوين إلى الحاوية. أحتاج إلى ترحيل عملية النشر هذه لاستخدام عامل عامل إنشاء بدلاً من Terraform. أنا مندهش من أن Docker-compose لا يوفر أي وظيفة للتكوين لكل حاوية.

هذا العدد مفتوح منذ 2 سنوات. هل هذا هو سبب تفوق Kubernetes على Docker في شعبيتها؟ Kubernetes provies التكوين وظائف الأسرار. فريق Docker ، يرجى على الأقل إضافة وظيفة التكوين.

لا يُقارن tbf docker-compose بـ k8s تمامًا ، ولا يُنصح باستخدامه في الإنتاج. إنه مخصص للتطوير والاختبار السريع. docker swarm هو الشيء الذي يمكن مقارنته بـ k8s وعلى الرغم من أنه أيضًا بسيط للغاية ، إلا أنه يحتوي على ميزات مثل التكوينات والأسرار.

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

يوم الثلاثاء 3 مارس 2020 الساعة 12:56 مساءً David Milum [email protected]
كتب:

tbf docker-compose لا يُقارن تمامًا بـ k8s ، ولا يُنصح به
لاستخدام الإنتاج. إنه مخصص للتطوير والاختبار السريع. عامل ميناء
السرب هو الشيء الذي يمكن مقارنته بـ k8s وعلى الرغم من أنه شديد أيضًا
بسيطة ، لديها ميزات مثل التكوينات والأسرار.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/docker/compose/issues/5523؟email_source=notifications&email_token=AAGRIFZTKGRWMZZ5H6DG3FDRFUSEJA5CNFSM4EKAVONKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW40
أو إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/AAGRIF4NTQQSR2QQWPJT6PLRFUSEJANCNFSM4EKAVONA
.

آخر "مضاد للنمط":

أستخدم docker-compose لتنسيق الحاوية أثناء التطوير المحلي ، و k8s للإنتاج.

وفقًا لنصيحة Docker الخاصة ، قمت بتنفيذ البرنامج النصي wait-for-it.sh أجل إدارة أمر بدء / إيقاف تشغيل الخدمة.

كما هو الحال ، ما لم أرغب في تحميل وحدة تخزين في كل خدمة لملف واحد فقط ، يتطلب ذلك نسخة من البرنامج النصي في دليل يحتوي على ملف Dockerfile لكل خدمة.

بدلاً من ذلك ، أود الاحتفاظ بنسخة واحدة من البرنامج النصي wait-for-it في دليل المستوى الأعلى حيث يتم نسخ docker-compose بعد ذلك في كل حاوية عند التشغيل محليًا ، حيث تتم إدارة هذه المخاوف بطريقة أخرى في k8s ، مما يعني أنني لا أريد أن تلوث هذه المخاوف بخدماتي ' Dockerfile s.

كما كتب إيمرسون ذات مرة: "الاتساق الأحمق هو غفلة العقول الصغيرة ، التي يعشقها رجال الدولة والفلاسفة والملهون الصغار".

ربما حان الوقت للاستماع إلى المستخدمين ...

Phylodome ألا يمكنك استخدام فحوصات صحة الحاوية و docker-compose depends_on ؟ هذه هي الطريقة التي أضمن بها التبعيات السليمة لبدء تشغيل الحاويات.

ما أفهمه هو أن wait-for-it.sh هو حقًا اختراق ، لأن خدماتك نفسها يجب أن تكون مرنة في مواجهة التبعيات القادمة والذهاب. بدء التشغيل هو مجرد حالة فردية لذلك.

ianfixes هل المقصود من "خدماتك" الإشارة إلى خدمات إنشاء عامل

هل المقصود من "خدماتك" الإشارة إلى خدمات إنشاء عامل الإرساء بأنفسهم ، أو "خدماتنا" ، كما هو الحال في الخدمات التي نكتبها نحن الذين يستخدمون عامل الإرساء؟

يجب أن تكون الخدمات التي تبنيها كمطور مرنة. هذا وفقًا لهذه المستندات: https://docs.docker.com/compose/startup-order/

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

للتعامل مع هذا الأمر ، صمم التطبيق الخاص بك لمحاولة إعادة إنشاء اتصال بقاعدة البيانات بعد الفشل. إذا أعاد التطبيق محاولة الاتصال ، فيمكنه في النهاية الاتصال بقاعدة البيانات.

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

ويمضي في ذكر نصوص مختلفة لانتظار الانتظار.

أنا يمكن القيام بعدد من الأمور. ولكن نظرًا لأن هذا مخصص فقط للتنمية المحلية ، ولأن لدي استراتيجيات أخرى للتعامل مع عمليات فحص خدمة الإنتاج في k8s ، فإنني أفضل التطبيق المحلي الأبسط والأقل اقتحامًا ، وليس النصائح العامة من الأشخاص الذين لا يعرفون تفاصيل لماذا " d ترغب في القيام بذلك (على سبيل المثال ، مشكلات w / volume-mounting لأداء مطور واجهة المستخدم عبر خادم تطوير Webpack).

على أي حال ، إنها مجرد حالة أخرى في القائمة الطويلة لحالات الاستخدام لهذه الميزة المحتملة التي يجب تركها لتقدير المستخدم.

أسمع غضبًا موجهًا نحوي ، وأتفهم لماذا سيكون من المحبط سماع "نصيحة" غير مرغوب فيها بشأن أسلوبك. لكني لست متأكدًا حتى من كيفية الاعتذار ؛ لقد اقتبست النص من عنوان URL الذي أشرت إليه بنفسك باسم "نصيحة Docker الخاصة" ، والتي تقول _صراحة_ أن نص انتظار النص هو وسيلة "للتغلب على المشكلة". لما يستحق ، أنا آسف على أي حال.

أنت لا تسمع الغضب. أنت تسمع النغمة الغاضبة لشخص ما ، عند البحث على Google لما يجب أن يكون سمة واضحة إلى حد ما ، تعثر في سلسلة من مائة تعليق حيث قام مجموعة من المشرفين باستمرار برعاية ورفض مناشدات المجتمع لميزة صالحة تمامًا.

لم أشارك تجربتي هنا ب / ج أردت اعتذارًا. لقد شاركته ببساطة لإضافته إلى القائمة الطويلة من الأدلة على أن مستخدمي Docker يرغبون في مرونة إضافية عند استخدام compose

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

بالإضافة إلى ذلك ، فإن إلقاء الضوء على المستخدمين بشكل اعتذاري يعد مظهرًا سيئًا.

أنا لست مشرفًا ولا مساهمًا في هذا المشروع ، وأعتذر عن أي التباس هناك. يبدو أن المساعدة الصغيرة التي اعتقدت أنني أستطيع تقديمها كانت غير مرغوب فيها وغير مفيدة ، وأنا آسف لإضاعة وقتك.

أريد هذه الميزة لحاوية Go التي تعد جزءًا من تطبيقي الموزع. نظرًا لأن الملف .env يجب تضمينه في جذر تطبيق Go ، فسوف أحتاج إلى إنشاء .env منفصل له ... وحيث أنه إذا كانت لدي هذه الميزة ، يمكنني لدي ملف المستوى الأعلى .env وانسخه في حاوية Go عند الإنشاء. قد يعني ذلك أشياء أقل أحتاج إلى تتبعها ...

قد يكون الحل البديل هو إنشاء هذا الملف عبر Dockerfile في Go Container أو إنشاء ملف .env لهذه الحاوية. لكن مع ذلك ، في أي وقت أقوم بإضافة var جديد ، سأحتاج إلى تحديثه في مكانين على الأرجح. حالة الاستخدام الجيد هنا. أو يمكنني فقط استخدام برنامج نصي شل إلى cp الملف بالنسبة لي ...

+1 لميزة النسخ

لقد حققنا ذلك بالفعل في Kubernetes من خلال السيارات الجانبية ، وهناك العديد من حالات الاستخدام. هذا ليس نمطًا مضادًا ، فقط إحدى الميزات التي تحافظ على إعادة إنشاء عامل الإرساء.

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

كيف يكون هذا مضادًا للنمط بينما docker يدعمه بالفعل؟ سيكون من المنطقي أن يتبع docker-compose قابلية استخدام عامل الرصيف القريب - عدم القيام بذلك هو في حد ذاته نمط مضاد.

تكمن المشكلة في هذا في أنه قصير النظر بشكل لا يصدق (ومن هنا جاء مصطلح "النمط المضاد") ، حيث سيجبرك على تكرار العملية في كل مرة يتم إعادة إنشاء الحاويات. ناهيك عن حقيقة أن قشورها سيئة للغاية (ماذا لو كان لديك 10 حاويات؟ 20؟ 100؟)

أعتقد أن الأمر متروك للمطور. مجرد نسخ ملف تكوين محلي واحد له عبء ضئيل. لا تلوم السكين.


PS My usecase؛ أريد إضافة تكوين إلى حاوية Nginx في مشروع بدون Dockerfiles.

من يعرف حتى بعد الآن.
كنت بحاجة إلى إعداد مشروع جديد والبحث عن جديد
أدوات ، Lando أفضل بكثير من هذا إنه مجنون. أتمنى أن أستخدمه
عاجلا.
إنه أسرع وأسهل في الفهم وأفضل دعم خارج الصندوق و
ليس لديه مشرفون / مساهمون متنازلون.

@ chris-crone بخصوص تعليقك ...

لملفات التكوين أو بيانات التمهيد ، هناك Docker Configs. هذه تعمل بشكل مشابه للأسرار ولكن يمكن تركيبها في أي مكان. يتم دعم هذه بواسطة Swarm و Kubernetes ، ولكن ليس بواسطة عامل إنشاء السفن. أعتقد أننا يجب أن نضيف دعمًا لها وسيساعد ذلك في بعض حالات الاستخدام المدرجة في هذه المشكلة.

هل Docker-Compose مهتم بتنفيذ دعم التكوين للتكافؤ مع تكوينات السرب؟

إذا كانت هناك تذكرة لهذا (أو إذا كنت بحاجة إلى إنشاء واحدة جيدة أيضًا) ، أود الاشتراك في ذلك وإلغاء الاشتراك في حريق القمامة هذا. أنا شخصياً سوف أغلق هذا وأرتبط بذلك ، لكن هذا أنا فقط.

harpratap أنت على حق ، لكن العيب هو أن / folder_in_container يجب ألا يكون موجودًا أو يجب أن يكون فارغًا وإلا فسيتم استبداله. إذا كان لديك برنامج نصي bash كنقطة دخول ، فيمكنك التحايل على هذا عن طريق ربط ملفاتك بالدليل المقصود أصلاً بعد إنشاء مجلد في / some_empty_location

+1 للحصول على وظيفة النسخ. حالة الاستخدام الخاصة بنا تتعلق بالوقوف السريع لبيئات التطوير المحلية والنسخ في التكوينات لإعدادات التطوير.

بالضبط. نحن لا نقيس جميعًا بنفس الطريقة. تستخدم شركتي SALT لإنشاء ملفات .conf المطلوبة لمجموعة متنوعة من التطبيقات. بناء واحد - مع الأساسيات - ثم إنشاء عامل الميناء لإنشاء مثيلات فردية بناءً على أجزائها الفريدة: عنوان MAC ، IP ، المنفذ ، التراخيص ، الوحدات ، إلخ. يمكن أن يتم ذلك من سطر أوامر - ولكن أسهل بكثير وأقل عرضة للخطأ من عامل البناء.

لدي حالة استخدام. لدينا اختبار بناء يتطلب إعداد SSL. يتم إنشاء الشهادات بواسطة خدمة في docker-compose ... ثم أقوم بإضافة هذه الشهادات إلى حاويات العميل ... إذا قمت بالتثبيت ، فقد فقدت الشهادات الحالية ولا يمكنني وضعها في بناء عامل الإرساء لأنهم لا يفعلون ذلك لا توجد بعد.

وبالتالي ، لا بد لي من تشغيل 2 docker-compose - 1 لتشغيل الخدمات لإنشاء الشهادات ثم أخرى لإنشاء الخدمات وتشغيل الاختبارات. فوضوي.

لقد رأيت الكثير من المشكلات هنا ، حيث اقترح المستخدمون الكثير من حالات الاستخدام لإحدى الميزات ، ولكن تم إسقاطها لأن المشرف يعتقد أنها مضادة للنمط أو لن يستخدمها الأشخاص أو بعض القصص الأخرى .

في حين أنه قد يبدو وكأنه نمط مضاد لشخص واحد ، فأنا متأكد من أن 1000 شخص يطلبون هذه الميزة ، والذين يفكرون بطريقة أخرى ، بحاجة إلى الاستماع إليهم أيضًا. إذا كانت هناك حاجة إلى بعض المساعدة في تطوير الميزة ، أعتقد أن العديد من الأشخاص يمكنهم المساعدة.

حالة الاستخدام الخاصة بي: بالإضافة إلى التكوينات ، لدي بعض المكتبات (RPM) التي أحتاج إلى تثبيتها في 5 من حاويات تطبيق ريلز (دبيان). إصدارات مختلفة من Ruby / Rails ، لذلك لا يمكنني استخدام نفس الصورة الأساسية ، لذلك يجب أن أكون قادرًا على تخزين الملفات في مكان واحد ونسخها إلى حاوية عند البناء ، لأنني لا أريد تنزيل 1.5 جيجابايت من البيانات أثناء البناء.

تضمين التغريدة

حالة الاستخدام الخاصة بي: بالإضافة إلى التكوينات ، لدي بعض المكتبات (RPM) التي أحتاج إلى تثبيتها في 5 من حاويات تطبيق ريلز (دبيان). إصدارات مختلفة من Ruby / Rails ، لذلك لا يمكنني استخدام نفس الصورة الأساسية ، لذلك يجب أن أكون قادرًا على تخزين الملفات في مكان واحد ونسخها إلى حاوية عند البناء ، لأنني لا أريد تنزيل 1.5 جيجابايت من البيانات أثناء البناء.

هل نظرت إلى بنى متعددة المراحل لهذا؟ أعتقد أنه سيكون حلاً أكثر قوة.

تسمح لك الإنشاءات متعددة المراحل باستخدام نفس Dockerfile لصور متعددة. يتيح لك ذلك تحليلها وتضمين وحدات البت التي تحتاجها فقط في كل صورة.

وخير مثال على ذلك هو الذي نستخدمه لبناء Docker Compose . يتم إنشاء هذا باستخدام إما Debian أو Alpine ولكنه يتيح لنا تحليل الشفرة المشتركة.

في إعدادنا ، قمنا بتكثيف ما يقرب من عشرة أجهزة محاكاة باستخدام عامل إنشاء السفن. المحاكيات هي نفسها ، ولكن يختلف ملف init واحد لكل هدف ويتم استهلاك هذا الملف عند بدء التشغيل (يتم حذفه عندما يكون الخادم قيد التشغيل). هل تقترح حقًا أنه يجب علينا إنشاء حوالي اثنتي عشرة صورة متطابقة تقريبًا لمجرد اختلاف ملف واحد؟ هذا لا معنى له IMO.

باستخدام عامل الإرساء ، يمكن استخدام علامة --copy-service لتحقيق ذلك. هل هناك أي بدائل يمكننا استخدامها مع عامل التركيب؟

مرحبًا megaeater ،

قمنا بتكثيف حوالي عشرة أجهزة محاكاة باستخدام عامل إنشاء عامل. المحاكيات هي نفسها ، ولكن يختلف ملف init واحد لكل هدف ويتم استهلاك هذا الملف عند بدء التشغيل (يتم حذفه عندما يكون الخادم قيد التشغيل).

هذه حالة استخدام مثيرة للاهتمام ؛ بعض الأسئلة: هل هذه المحاكيات (أو أجزاء منها) تعمل على الإطلاق في الإنتاج (على سبيل المثال: ليست على جهاز المطور أو CI)؟ إذا كان الرمز مفتوحًا (أو كان هناك نظام مشابه) ، هل يمكنك ربطني به حتى أتمكن من إلقاء نظرة؟

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

هل تقترح حقًا أنه يجب علينا إنشاء حوالي اثنتي عشرة صورة متطابقة تقريبًا لمجرد اختلاف ملف واحد؟ هذا لا معنى له IMO.

تستند الصور إلى طبقة لهذا السبب بالضبط: ستشير جميع الصور إلى نفس الطبقات باستثناء الطبقة التي تتضمن الملفات المختلفة.

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

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

شكرًا لك على التعليق @ chris-crone

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

@ chris-crone شكرا لك على الروابط. سألقي نظرة وأرى ما إذا كان يعمل معنا 👍

مرحبًا @ chris-crone ، لقد حاولت استخدام تصميمات Multi Stage ، وقد ساعدنا ذلك في الاحتفاظ بالمكتبات / التكوين في موقع واحد فقط ونسخها ، ولكن هناك الآن مشكلات تتعلق بتجاهل .dockerignore ، بغض النظر عن المكان أنا أضعها.

إنه يعمل عندما أستخدم Docker فقط مع الخيار DOCKER_BUILDKIT ، لكنه لا يعمل عند استخدام docker-compose ، جربت COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build ، لكن ما زلت لم تنجح. أيه أفكار؟

كنت أتساءل ، إذا كان هناك خيار لتحديد مكان البحث عن .dockerignore في الإنشاء ، عندما عثرت على هذه المشكلة https://github.com/docker/compose/issues/6022 ، والتي مرة أخرى ، تم إغلاقه ، يعتقد مساهم coz 1 أن هذا ليس مفيدًا.

هذا محبط للغاية إذا كنت صادقًا هنا !!

يعد هذا أمرًا بالغ الأهمية في نظام MacOS ، لأن جعل دورات التطوير لديك أقرب ما يمكن من الإنتاج أمر بالغ الأهمية ؛ من الواضح لممارسات التسليم المستمر المناسبة. على سبيل المثال ، قم ببناء الحاوية ، ولكن بعد ذلك قم بربط الإصدار الجديد من البرنامج الذي تعمل عليه حاليًا في الحاوية لتوفير أوقات دورة الإنشاء. لسوء الحظ ، تعتبر حوامل الربط مكلفة للغاية ، حيث تكون أبطأ من 3 إلى 5 مرات.

على سبيل المثال ، وقت بدء تشغيل tomcat حوالي 3 ثوانٍ لتطبيقي في حاوية. أضف رابط ربط ~ / .bash_history وهو 4s. أضف رابط ربط لتطبيقي وعادة ما يكون حوالي 18-20 ثانية. في Linux ، يشبه أداء ربط التحميل أداء نظام الملفات المحلي ، ولكن ليس في نظام MacOS. قسّم ذلك إلى 100 مرة في اليوم وهذا أمر مهم.

هذا لا يشمل البطء الذي يستمر عند الوصول إلى التطبيق لأول مرة ؛ حتى يتم تخزين ملفات التعليمات البرمجية مؤقتًا. بالنسبة لي ، هذا يعني 3 دقائق ، بما في ذلك التأخر عبر الإنترنت في الاتصال بـ monolithic oracle db لتغيير عبارة صغيرة إلى شيء آخر ، ومعرفة ما إذا كانت لا تزال تبدو على ما يرام. لعنة كوفيد -19 ، لول.

من الناحية المثالية ، أود أن أكون قادرًا فقط على تشغيل docker-compose مرة أخرى و "تحديث" تطبيقي في الحاوية قيد التشغيل ، واطلب من tomcat إعادة التحميل. يمكنني استخدام مدير tomcat لتحميل التغيير ، ولكن لدينا أيضًا تطبيقًا خلفيًا لا يستخدم حاوية مُدارة من أي نوع ، لذلك يتعين علينا بعد ذلك استخدام حل مختلف لذلك.

سيكون من الرائع أن يكون تكوين عامل الإرساء موجهًا نحو التطوير أيضًا ، وليس مجرد نشر الإنتاج.

حالة الاستخدام هذه ذات صلة بالمناقشة: https://github.com/docker/compose/issues/3593#issuecomment -637634435

@ كريس كرون

تضمين التغريدة

حالة الاستخدام الخاصة بي: بالإضافة إلى التكوينات ، لدي بعض المكتبات (RPM) التي أحتاج إلى تثبيتها في 5 من حاويات تطبيق ريلز (دبيان). إصدارات مختلفة من Ruby / Rails ، لذلك لا يمكنني استخدام نفس الصورة الأساسية ، لذلك يجب أن أكون قادرًا على تخزين الملفات في مكان واحد ونسخها إلى حاوية عند البناء ، لأنني لا أريد تنزيل 1.5 جيجابايت من البيانات أثناء البناء.

هل نظرت إلى بنى متعددة المراحل لهذا؟ أعتقد أنه سيكون حلاً أكثر قوة.

تسمح لك الإنشاءات متعددة المراحل باستخدام نفس Dockerfile لصور متعددة. يتيح لك ذلك تحليلها وتضمين وحدات البت التي تحتاجها فقط في كل صورة.

وخير مثال على ذلك هو الذي نستخدمه لبناء Docker Compose . يتم إنشاء هذا باستخدام إما Debian أو Alpine ولكنه يتيح لنا تحليل الشفرة المشتركة.

تعد الإنشاءات متعددة المراحل رائعة ، ولكنها تعاني من مشكلاتها الخاصة ، حيث يتعين عليك تشغيل جميع المراحل في نفس السياق ، وهو أمر غير ممكن دائمًا. أيضا، بقدر ما أعرف، لا يمكنك استخدام بسهولة COPY --from مع الصور المحددة في Dockerfile آخر، وبنى مع docker-compose build (أفترض أنك يمكن أن تفعل ذلك عن طريق بناء ووضع علامات عليها يدويا).

COPY بحد ذاته محدود للغاية لأنه يمكنك فقط الاستيراد من سياق البناء الخاص بك. يمكن نسخ docker cp من أي مكان إلى أي مكان ، باستثناء أنه لا يمكنه النسخ بين الصورة والحاوية (نوع مثل COPY --from ).

حالة الاستخدام الخاصة بي مختلفة قليلاً (بصرف النظر عن نسخ ملفات التكوين للقراءة فقط ، فإن حوامل وحدة التخزين المحلية ليست أفضل فكرة عند النشر على جهاز آخر) وأود أن أقول إن ما أفعله الآن هو مضاد ... . من المحتمل أن يكون لدي العديد من الصور المختلفة التي تنشئ حزم أصول JS + HTML + مُجمَّعة ومُصغَّرة (فكر في تطبيقات الزوايا الصغيرة) ، وخادم nginx واحد يخدمها جميعًا (nb مبني من صورة مخصصة بسبب المكونات الإضافية).

حاليًا ، ما يجب علي فعله هو نسخ حزم "النشر" من صور "الإنشاء" عند بدء التشغيل. من الناحية المثالية ، يجب أن يتم ذلك إما عند إنشاء الحاوية ، أو عند الإنشاء ، لكن الأخير يتطلب إنشاء صورة أخرى أعلى "nginx المعدل".

قم بتصوير مخطط المشروع التالي (قد تعيش المشاريع الفرعية في مستودعات منفصلة ولا تعرف بعضها البعض):

app1/
  src/
    ...
  Dockerfile
app2/
  src/
    ...
  Dockerfile
app3/
  src/
    ...
  Dockerfile
nginx/
  ...
  Dockerfile
docker-compose.yml

يحتوي كل ملف app{1,2,3}/Dockerfile على هدف / مرحلة build الذي ينشئ التطبيق لـ /usr/src/app/dist . nginx/Dockerfile له مرحلة واحدة فقط وإنشاء صورة مشابهة لـ nginx/nginx ، ولكن مع جميع المكونات الإضافية المطلوبة (بدون تكوينات).

docker-compose.yml:

version: '3.8'
services:
  app1-build:
    build:
      context: app1/
      target: build
    image: app1-build
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        rm -vfr /dist-volume/app1 \
        && cp -vr /usr/src/app/dist /dist-volume/app1 \
        && echo "Publishing successful"
    volumes:
      - 'dist:/dist-volume'

  app2-build:
    build:
      context: app2/
      target: build
    image: app2-build
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        rm -vfr /dist-volume/app3 \
        && cp -vr /usr/src/app/dist /dist-volume/app3 \
        && echo "Publishing successful"
    volumes:
      - 'dist:/dist-volume'

  #... same thing for app3-build

  nginx:
    build:
      context: nginx/
    image: my-nginx
    volumes:
      - 'dist:/var/www'
      - # ... (config files etc)

volumes:
  dist:

الآن ، من الواضح أن هذا غير مثالي ، كل صورة لبناء التطبيق يتم تشغيلها دون داعٍ وتنتهي بسرعة ، الصور المنشورة موجودة على وحدة تخزين مشتركة (أفترض أن هذا له تأثير سلبي على الأداء ، لكنني لم أتمكن من التحقق منه بعد). إذا كان الخيار copy أو copy_from هو خيار إنشاء عامل الإرساء ، فيمكن كتابة نفس الخيار على النحو التالي:

version: '3.8'
services:
  # assuming the images have default entrypoint and cmd combination that immediately returns with success.
  app1-build:
    build:
      context: app1/
      target: build
    image: app1-build

  #... same thing for app2-build app3-build

  nginx:
    build:
      context: nginx/
    image: my-nginx
    copy:
      - from: app1-build  # as image or service, both have their pros and cons, service would mean an image associated with this service
         source: /usr/src/app/dist
         destination: /var/www/app1
      - from: app2-build
         source: /usr/src/app/dist
         destination: /var/www/app2
      - from: app3-build
         source: /usr/src/app/dist
         destination: /var/www/app3
    volumes:
      - # ... (config files etc)

حالة الاستخدام الخاصة بي ليست في خطوة الإنشاء أو خطوة بدء التشغيل. أنا أحضر الملفات التي تم إنشاؤها داخل حاوية أو كل حاوية خدمة ، يتم تنفيذ هذه الحاوية على محرك Docker البعيد. حتى الآن أجد نفسي أفعل شيئًا مثل docker-compose ps -qa <service> | xargs -i docker cp {}:<there> <here> . أنا فقط أتمنى أن أتمكن من الالتزام بتكوين عامل ميناء بشكل فريد في النص الخاص بي.

@ كريس كرون

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

هل تستمتع بجلد النفس؟ إذا كان الأمر كذلك ، فإنني أوصي بتشغيل تطبيق باستخدام ربط ربط على نظام MacOS. 🤣 انظر رسالتي السابقة للحصول على التفاصيل.

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

@ chris-crone أعتقد أن هذا شعور رائع ، لأن الناس في كثير من الأحيان يدخلون في تنفيذ أنماط مضادة لعمال الإرساء ، مثل عدم إدارة التكوين والبيانات بطريقة سريعة الزوال.

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

تضمين التغريدة

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

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

تضمين التغريدة

لقد ساعدنا في الاحتفاظ بالمكتبات / التهيئة في موقع واحد فقط ونسخها ، ولكن توجد الآن مشكلات تتعلق بتجاهل .dockerignore ، بغض النظر عن المكان الذي أضعه فيه.
إنه يعمل عندما أستخدم Docker فقط مع الخيار DOCKER_BUILDKIT ، لكنه لا يعمل عند استخدام docker-compose ، جربت COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build ، لكن ما زلت لم تنجح. أيه أفكار؟

ساعد بناء متعدد المراحل سعيد! ما هو إصدار Docker و docker-compose الذي تستخدمه؟ سأحاول مع الأحدث وأرى ما إذا كانت المشكلة لا تزال قائمة. يجب أن يحترم ملف .dockerignore.

Marandil ، يبدو أن docker build لا يتعامل مع بنية مشروعك (على سبيل المثال : بنية الدليل) وهي المشكلة. قد تتمكن من استخدام شيء مثل docker buildx bake (https://github.com/docker/buildx) لحل حالة الاستخدام هذه. ملاحظة: يتم العمل على buildx لذا فهو ليس مستقرًا للغاية حتى الآن ولكنه يهدف إلى حل بعض ما تصيبه.

itscaro ، شكرًا docker build لإخراج النتيجة من صورة FROM scratch . يعمل هذا فقط في الحالات التي تحتاج فيها إلى إخراج حاوية واحدة.

TrentonAdams ، لقد عملنا على تحسين أداء نظام الملفات لـ Docker Desktop ولكنه صعب. المشكلة الأساسية هي اجتياز حدود الجهاز الظاهري. تمت إعادة كتابة وحدات بت مشاركة الملفات مؤخرًا (يمكنك تمكين التجربة الجديدة باستخدام التبديل "استخدام gRPC FUSE لمشاركة الملفات" في التفضيلات) وهذا من شأنه أن يحل بعض مشكلات استخدام وحدة المعالجة المركزية عالية التي كان الأشخاص يراها. لدينا بعض الوثائق حول ضبط الأداء هنا وهنا .

@ كريس كرون

Marandil ، يبدو أن docker build لا يتعامل مع بنية مشروعك (على سبيل المثال : بنية الدليل) وهي المشكلة. قد تتمكن من استخدام شيء مثل docker buildx bake (https://github.com/docker/buildx) لحل حالة الاستخدام هذه. ملاحظة: يتم العمل على buildx لذا فهو ليس مستقرًا للغاية حتى الآن ولكنه يهدف إلى حل بعض ما تصيبه.

شكرًا ، سأبحث في docker buildx bake . يبدو الأمر واعدًا ، لكنني لم أجد أي مرجع أو توثيق جيد له ، والصفحات على docs.docker.com عارية نوعًا ما (راجع https://docs.docker.com/engine/reference/commandline/buildx_bake /). لقد وجدت حتى الآن https://twitter.com/tonistiigi/status/1290379204194758657 تشير إلى بعض الأمثلة (https://github.com/tonistiigi/fsutil/blob/master/docker-bake.hcl، https: // github .com / tonistiigi / binfmt / blob / master / docker-bake.hcl) ، قد تكون هذه نقطة انطلاق جيدة ، ولكنها بالكاد مرجع جيد.

TrentonAdams ، لقد عملنا على تحسين أداء نظام الملفات لـ Docker Desktop ولكنه صعب. المشكلة الأساسية هي اجتياز حدود الجهاز الظاهري. تمت إعادة كتابة وحدات بت مشاركة الملفات مؤخرًا (يمكنك تمكين التجربة الجديدة باستخدام التبديل "استخدام gRPC FUSE لمشاركة الملفات" في التفضيلات) وهذا من شأنه أن يحل بعض مشكلات استخدام وحدة المعالجة المركزية عالية التي كان الأشخاص يراها. لدينا بعض الوثائق حول ضبط الأداء هنا وهنا.

@ كريس كرون الجحيم نعم ، شكرا جزيلا! هناك تحسن 3-4 ثوانٍ مع الخيار الجديد ، واستخدام "التخزين المؤقت" يعطيني نفس أداء التشغيل خارج الحاوية ، لذلك هذا ضخم بالنسبة لي. أرى أوقات بدء تشغيل تطبيقنا منخفضة تصل إلى 2800 مللي ثانية ، لذا لم يعد هذا من 11 إلى 18 ثانية. ياي! لست بحاجة إلى أي شيء آخر غير التخزين المؤقت ، لأنني أقوم فقط بإعادة إنشاء الحاويات في كل مرة على أي حال.

@ chris-crone هل هناك مكان يجب أن أنشر فيه عناصر الأداء للمساعدة في ضبط الأداء والتعليقات على MacOS؟ أتساءل لماذا تكون الحاوية التي تم تشغيلها حديثًا مع ربط الربط بطيئة عند عدم استخدام cached . يجب أن يكون هناك بعض الأشياء الغريبة حيث يتم الانتقال ذهابًا وإيابًا للتحقق من كل ملف عند بدء التشغيل إذا كانت متزامنة ، حتى عندما تكون جديدة تمامًا؟

Use-case: أقوم بتشغيل حاوية وتعديل ملف (على وجه التحديد ، يعدل Keycloak ملف التكوين الخاص به بناءً على متغيرات البيئة وما إلى ذلك). أريد نسخة من هذا الملف على القرص المحلي الخاص بي حتى أتمكن من التحقق من نتيجة هذا التعديل ، وتتبع تقدمي بمرور الوقت بينما أقوم بتعديل البرامج النصية للحاوية. في الوقت الحالي ، أحتاج إلى العثور على معرف الحاوية الجديد في كل مرة حتى أتمكن من استخدام docker cp .

حالة الاستخدام:
النامية في عامل الميناء.
أحتاج إلى إعادة نشر ملف القفل الخاص بي على الجهاز المضيف أو الكتابة فوقه عندما تقوم الحاوية بتركيب مجلد المشروع.

حالة الاستخدام: أحتاج إلى نسخ ملف يحتوي على مفتاح سري. يقرأ التطبيق الذي يتم تشغيله داخل الحاوية هذا الملف في الذاكرة ويحذفه من القرص.

حالة الاستخدام: أقوم بإجراء اختبارات وحدة c ++ في حاوية عامل إرساء. أريد ببساطة نسخ الرمز إلى صورة موجودة في كل مرة.

1) القيام بذلك باستخدام ملف dockerfile COPY يعني أن الكود تمت كتابته على صورة جديدة غير ضرورية وأحتاج إلى حذف تلك الصورة للتأكد من أن التشغيل التالي ينشئ صورة جديدة بأحدث رمز.

2) القيام بذلك باستخدام docker-compose volumes yaml config يعني أن Docker يقوم بتشويه الكود المصدري كـ root:root (مما يؤدي إلى قتل IDE الخاص بي تمامًا من إجراء التعديلات حتى أعيده!)

@ shin- هل أتبع نمطًا مضادًا عن طريق إجراء اختبارات وحدة في حاوية؟ ما هي الطريقة غير المضادة للنمط لحل هذا؟

.... أنا متمسك بالخيار الأول لأنه أقل الآلام. لكني أرى عامل ميناء-يؤلف دعمًا لتكوين نسخة يعد بمثابة تحسين رائع! على الأقل لسير العمل هذا!

soulseekah ألا تستخدم الأسرار في التأليف بشكل أفضل لحالة الاستخدام هذه؟

لقد وجدت حلاً مناسبًا لي:

  1. أنشئ ملف Dockerfile باستخدام
    COPY a_filename .
  2. قم ببناء الصورة باستخدام Dockerfile
    docker build -t myproject:1.0 .
  3. قم بتحرير عامل الإرساء لاستخدام الصورة التي أنشأتها للتو
version: "3.7"
services:
  app:
    image: myproject:1.0
    ports:
      - 3000:3000
    networks:
       - mynetwork
       - internal
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: not_so_secret_password # don't do this 
      # https://diogomonica.com/2017/03/27/why-you-shouldnt-use-env-variables-for-secret-data/
      MYSQL_DB: appdb
    deploy:
      resources:
        limits:
          cpus: '0.75'
          memory: 100M

ليس حلاً مثاليًا ، لكنه يعمل في حالة الاستخدام الخاصة بي.

soulseekah ألا تستخدم الأسرار في التأليف بشكل أفضل لحالة الاستخدام هذه؟

لسوء الحظ ، يتطلب ذلك سربًا آخر مرة حاولت:

soulseekah ألا تستخدم الأسرار في التأليف بشكل أفضل لحالة الاستخدام هذه؟

لسوء الحظ ، يتطلب ذلك سربًا آخر مرة حاولت:

soulseekah ربما استخدم الحل البديل الذي أستخدمه (

ChristophorusReyhan يشار إلى مشكلة هذا الحل في تعليق zoombinis :

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

أثناء العمل ، يمكن أن يؤدي إلى بعض الصيانة غير المرغوب فيها. على سبيل المثال ، لتنظيف الصورة غير المرغوب فيها _ مع الحفاظ أيضًا على أي صور تهتم بها_:

docker-compose up && docker-compose down --rmi local

ولكن تأكد من أن جميع الصور التي تهتم بها تحتوي على علامة مخصصة وأن الصورة الاختبارية / الوهمية ليست كذلك

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات