मुझे कई चलने वाले कंटेनरों के खिलाफ एक कमांड चलाने की आवश्यकता है । उदाहरण के लिए, मान लें कि कोड अपडेट प्राप्त करने के बाद मेरे ऐप को डेटाबेस के खिलाफ डेटा संरचना अपडेट चलाने की आवश्यकता है । इसके लिए हम दौड़ना चाहते हैं 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. तो फिर हम exec कमांड:
चूंकि हम वास्तव में इस प्रकार के ऑपरेशन के लिए सक्रिय कंटेनरों का उपयोग नहीं करना चाहते हैं, इसलिए एक बेहतर विकल्प यह होगा कि इसके बजाय उसी डेटा पर एक नया एकल-उपयोग कंटेनर अभिनय शुरू किया जाए:
- 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 आउटपुट को फ़िल्टर करने के लिए । परिणाम एक रजिस्टर में संग्रहीत है । चूंकि इनपुट एक सूची है, इसलिए इसका सीधा परिणाम होगा कि डेटा को वापस कैसे प्राप्त किया जाए, अधिक नीचे । Uncomment के debug सूची के साथ और बिना रजिस्टर में संग्रहीत डेटा की तुलना करने के लिए बीच में कार्य करें ।
रजिस्टर के परिणामों (कंटेनर आईडी) पर पुनरावृति करें और उपयोग करें docker_container एक क्रिया चलाने के लिए मॉड्यूल (command पैरामीटर)। आप उपयोग कर सकते हैं links और volumes_from अपने में docker_container मंगलाचरण। के ऑन-लाइन प्रलेखन की जाँच करें मॉड्यूल विवरण के लिए ।
@ थ्रिग, इसे एक सिस्टम पर चलने वाले कंटेनरों पर लागू करने की आवश्यकता है, न कि कई वाले । अगर मुझे कई प्रणालियों पर कमांड लागू करने की आवश्यकता है तो मैं इसे पूरा करने के लिए बस एक इन्वेंट्री का उपयोग करूंगा ।
नहीं @ टेकराफ, उस उदाहरण में डॉकर पीएस-फ़िल्टर का उपयोग करना अधिक कुशल है । सवाल यह है कि के बारे में idempotency और सबसे अच्छा अभ्यास, के बाद से चल रहा है ऊपर के रूप में शेल कमांड नहीं है idempotent. आपने सोचा होगा कि यदि सक्षम हो, तो इसे पूरा करने के लिए उत्तरदायी के अपने डॉकर एपीआई का उपयोग करना अधिक समझ में आएगा ।
Idempotency है, एक महत्वपूर्ण अवधारणा के साथ ansible, @techraf. जब शेल कमांड को भोलेपन से चलाया जाता है, तो हम यह आकलन करने की क्षमता खो देते हैं कि सिस्टम ने प्लेबुक की आवश्यकताओं को पूरा किया है (और कार्य को छोड़ दें) या नहीं । इसलिए शेल के बजाय उत्तरदायी देशी एपीआई मॉड्यूल चलाना हमेशा उचित होता है । उत्तरदायी मैनुअल बताता है, डब्लूआरटी टू स्टडऑट_लाइन्स, इस खाते पर अक्सर इसका उपयोग नहीं करने के लिए ।