कई डॉकर कंटेनरों में एक उत्तरदायी कमांड चलाना

मुझे कई चलने वाले कंटेनरों के खिलाफ एक कमांड चलाने की आवश्यकता है । उदाहरण के लिए, मान लें कि कोड अपडेट प्राप्त करने के बाद मेरे ऐप को डेटाबेस के खिलाफ डेटा संरचना अपडेट चलाने की आवश्यकता है । इसके लिए हम दौड़ना चाहते हैं 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: Exec the database update  cmd: "docker exec -it {{ item }} my-app-db-update.sh"  with: 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 ps:

$ 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

यह प्लेबुक आपको इस बात का अंदाजा देगी कि आपको आवश्यक डेटा कैसे कैप्चर करना है और प्रदान की गई सूची पर पुनरावृत्त क्रियाओं को कैसे चलाना है । यह एक बहुत ही सरल उदाहरण है, और आपको इसे अपनी आवश्यकताओं के अनुकूल बनाना होगा । यह उद्देश्य पर है:

---- hosts: localhost  gather_facts: no  tasks:  - name: gather list of containers    shell: docker ps | awk '/{{ item }}/{print $1}'    register: list_of_containers    with_items:      - busybox  #- name: debug  #  debug: msg="{{ list_of_containers }}"  - name: run action in container(s)    docker_container:      name: temp-container      image: busybox      command: uptime      cleanup: yes      detach: yes    register: result_of_action    with_items:      - list_of_containers.results.stdout_lines

दिलचस्प भाग हैं:

  1. किसी दिए गए होस्ट में कंटेनरों की सूची इकट्ठा करें (localhost मेरे उदाहरण में) । मैंने एक सादे का उपयोग किया है shell उपयोग करने में सक्षम होने के लिए मंगलाचरण awk आउटपुट को फ़िल्टर करने के लिए । परिणाम एक रजिस्टर में संग्रहीत है । चूंकि इनपुट एक सूची है, इसलिए इसका सीधा परिणाम होगा कि डेटा को वापस कैसे प्राप्त किया जाए, अधिक नीचे । Uncomment के debug सूची के साथ और बिना रजिस्टर में संग्रहीत डेटा की तुलना करने के लिए बीच में कार्य करें ।

  2. रजिस्टर के परिणामों (कंटेनर आईडी) पर पुनरावृति करें और उपयोग करें docker_container एक क्रिया चलाने के लिए मॉड्यूल (command पैरामीटर)। आप उपयोग कर सकते हैं links और volumes_from अपने में docker_container मंगलाचरण। के ऑन-लाइन प्रलेखन की जाँच करें मॉड्यूल विवरण के लिए ।

@ थ्रिग, इसे एक सिस्टम पर चलने वाले कंटेनरों पर लागू करने की आवश्यकता है, न कि कई वाले । अगर मुझे कई प्रणालियों पर कमांड लागू करने की आवश्यकता है तो मैं इसे पूरा करने के लिए बस एक इन्वेंट्री का उपयोग करूंगा ।

@ टेकराफ - मैंने प्रश्न संपादित किया है । इसमें अब एक प्रश्न चिह्न शामिल है ।

तो आप वास्तव में डॉकर पीएस | ग्रेप माय-इमेज: लेटेस्ट | कट-एफ 1के समान पाइप के सिंटैक्स के लिए पूछ रहे हैं?

नहीं @ टेकराफ, उस उदाहरण में डॉकर पीएस-फ़िल्टर का उपयोग करना अधिक कुशल है । सवाल यह है कि के बारे में idempotency और सबसे अच्छा अभ्यास, के बाद से चल रहा है ऊपर के रूप में शेल कमांड नहीं है idempotent. आपने सोचा होगा कि यदि सक्षम हो, तो इसे पूरा करने के लिए उत्तरदायी के अपने डॉकर एपीआई का उपयोग करना अधिक समझ में आएगा ।

प्रश्न के साथ उदासीनता का क्या करना है? कोई प्रश्न। कृपया समझाएं।

Idempotency है, एक महत्वपूर्ण अवधारणा के साथ ansible, @techraf. जब शेल कमांड को भोलेपन से चलाया जाता है, तो हम यह आकलन करने की क्षमता खो देते हैं कि सिस्टम ने प्लेबुक की आवश्यकताओं को पूरा किया है (और कार्य को छोड़ दें) या नहीं । इसलिए शेल के बजाय उत्तरदायी देशी एपीआई मॉड्यूल चलाना हमेशा उचित होता है । उत्तरदायी मैनुअल बताता है, डब्लूआरटी टू स्टडऑट_लाइन्स, इस खाते पर अक्सर इसका उपयोग नहीं करने के लिए ।