أحتاج إلى تشغيل أمر ضد حاويات تشغيل متعددة. على سبيل المثال ، لنفترض أن تطبيقي يحتاج إلى تشغيل تحديث بنية البيانات مقابل قاعدة بيانات بعد تلقي تحديثات التعليمات البرمجية. للقيام بذلك ، ونحن نريد لتشغيل docker build <project_dir> -t latest، ثم docker stop; docker rm; docker run. في هذه المرحلة ، يمكننا أن نفترض أننا قمنا بتحديث الكود الأساسي للحاوية ، لكننا ما زلنا بحاجة إلى تشغيل تحديث قاعدة البيانات باستخدام الأدوات الخاصة بالتطبيق.
أساسا ، أنا بحاجة إلى بعض الطريق للحصول على قائمة من الحاويات قيد التشغيل ، تصفيتها من قبل بعض المعايير ، وتسجيل تلك معرفات الحاويات مع أنسيبل. ثم لكل حاوية نقوم بتشغيل الأمر.
مثل هذا:
- name: Get list of running containers docker: image: my-image:latest state: running register: container_ids
ستقوم هذه المهمة بتخزين قائمة الحاويات قيد التشغيل التي تستخدم my-image:latest إلى container_ids. ثم نقوم بتنفيذ الأمر:
نظرا لأننا لا نريد حقا استخدام الحاويات النشطة لهذا النوع من العمليات، فإن الخيار الأفضل هو بدء حاوية جديدة للاستخدام مرة واحدة تعمل على نفس البيانات بدلا من ذلك:
- name: Run the database update cmd: "docker run --rm --volumes-from {{ item }} --link:mydb:db my-app sh -c 'my-app-db-update.sh'" with: container_ids
ما سبق هو رمز زائف فقط-لن يتم تشغيله بالفعل. كيف يمكنني إنجاز مهمة تخزين قائمة تشغيل حاويات عامل الميناء التي تلبي معايير معينة ، حتى أتمكن من تطبيق أمر على كل حاوية في القائمة باستخدام إما docker exec أو docker run?
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7e21761c9c44 busybox "top" 22 minutes ago Up 22 minutes agitated_yonath7091d9c7cc56 nginx "nginx -g 'daemon off" 23 minutes ago Up 23 minutes 80/tcp, 443/tcp fervent_blackwell
وهذا قواعد اللعبة التي تمارسها تعطيك فكرة عن كيفية التقاط البيانات التي تحتاج إليها وكيفية تشغيل الإجراءات بالتكرار على القائمة المقدمة. إنه مثال بسيط للغاية ، وسيتعين عليك تكييفه مع احتياجاتك. هذا عن قصد:
جمع قائمة الحاويات في مضيف معين (localhost في بلدي على سبيل المثال).لقد استخدمت سهل shell الاحتجاج لتكون قادرة على استخدام awk لتصفية الإخراج. يتم تخزين النتيجة في سجل. منذ المدخلات هي قائمة ، وهذا سيكون له نتيجة مباشرة على كيفية استرداد البيانات مرة أخرى ، أكثر أدناه. عدم التعليق على debug مهمة بين لمقارنة البيانات المخزنة في السجل مع وبدون قائمة.
كرر على نتائج السجل (معرف الحاوية) واستخدم docker_container وحدة لتشغيل إجراء (command المعلمة). يمكنك استخدام links و volumes_from في الخاص بك docker_container الاحتجاج. تحقق من وثائق على الانترنت من الوحدة للحصول على التفاصيل.
@ تريج ، يجب تطبيق هذا على الحاويات التي تعمل على نظام واحد ، وليس على عدة حاويات. إذا كنت بحاجة إلى تطبيق الأمر على أنظمة متعددة ، فسأستخدم ببساطة قائمة جرد لتحقيق ذلك.
لا @تكراف ، انها أكثر كفاءة لاستخدام عامل الميناء بس filter تصفية في تلك الحالة. والسؤال هو حول إديمبوتنسي وأفضل الممارسات ، منذ تشغيل ما سبق كأوامر قذيفة ليست إديمبوتنت. كنت قد فكرت أنه سيكون من المنطقي استخدام أبي عامل الميناء الخاص أنسيبل لإنجاز هذا ، إذا كان قادرا.
إديمبوتنسي هو مفهوم مهم مع أنسيبل ، @تكراف. عند تشغيل أوامر شل بسذاجة باستخدام أنسيبل ، نفقد القدرة على تقييم ما إذا كان النظام قد استوفى متطلبات قواعد اللعبة (وتخطي المهمة) أم لا. هذا هو السبب في أنه من المستحسن دائما لتشغيل وحدات أبي الأصلية أنسيبل بدلا من قذيفة. الدول دليل أنسيبل ، ورت إلى ستدوت_لينس ، وليس لاستخدامه في كثير من الأحيان على هذا الحساب.