यदि यह चल रहा है तो डॉकटर कंटेनर को रोकें और हटाएं


82

अगर यह चल रहा है तो मैं एक डॉकटर कंटेनर को व्यावहारिक रूप से रोकना और हटाना चाहता हूं। यह एक बिल्ड स्क्रिप्ट के लिए है।

निम्नलिखित उदाहरण लें। मैं बैश स्क्रिप्ट में NAMES कॉलम के तहत देखे गए डॉक कंटेनर "rabbitmq" को कैसे रोकूंगा और हटाऊंगा?

docker ps

CONTAINER ID        IMAGE             COMMAND                  CREATED             STATUS              PORTS                   NAMES
9909a5e2856f        rabbitmq-image   "/docker-entrypoint.s"   11 minutes ago      Up 11 minutes       0.0.0.0:5672->5672/tcp, rabbitmq
8990dd1fe503        redis-image      "/entrypoint.sh redis"   6 weeks ago         Up 4 days           0.0.0.0:32770->6379/tcp redis
etc 

निम्न कमांड कंटेनर को हटा देगा और वही करेगा जो मैं करना चाहता हूं

docker stop rabbitmq && docker rm -f rabbitmq

हालाँकि, यह इसे एक स्क्रिप्ट में शामिल कर रहा है, जिसे मैं जानना चाहूंगा? मुझे लगता है कि यह कुछ इस तरह दिखेगा।

#!/bin/bash

if [ /*docker ps check some value */ ]; then
   docker stop rabbitmq && docker rm -f rabbitmq
fi

जवाबों:


190

जैसा कि आपने शायद देखा है, docker stopसाथ ही docker rmएक स्टेटस कोड के साथ बाहर निकलना विफलता का संकेत देता है कि कंटेनर मौजूद नहीं है या नहीं चल रहा है। इससे आपके बिल्ड फेल हो जाते हैं।

यदि आप अपने बिल्ड लॉग में त्रुटि संदेशों के साथ सामना कर सकते हैं तो आप असफल होने के शेल कमांड को रोकने के लिए यह छोटी सी चाल कर सकते हैं:

docker stop rabbitmq || true && docker rm rabbitmq || true

इस मामले में कि डॉक कमांड में से एक विफल हो जाता है, trueउसे कहा जाता है जो हमेशा स्थिति कोड के साथ बाहर निकलता है जो सफलता का संकेत देता है।


कंटेनर में मौजूद त्रुटि संदेश अभी भी वापस नहीं आया है, लेकिन स्थिति कोड सफलता का संकेत दे रहा है। मेरी बांस की पाइपलाइन की प्रक्रिया बिना असफल हुई, इसलिए यह मेरे लिए काम करती है।
shamanSK

3
यह Error response from daemon: no such id: rabbitmqतब उत्पन्न होगा जब कंटेनर पहले ही हटा दिया गया हो।
शुभ

3
@anubhava: सही है। जैसा कि पहले ही उत्तर में बताया गया है: "ट्रिक" केवल डॉकटर कमांड के रिटर्न वैल्यू को अनदेखा करना है। यदि आपको त्रुटि संदेशों के बिना "क्लीन" समाधान की आवश्यकता है, तो आपको यह जांचना होगा कि कंटेनर मौजूद है या नहीं।
जोहान्स बरोप

मेरे लिए, यह कमांड अब काम नहीं करता है, यह काम करता था लेकिन अब यह काम नहीं करता ... क्या यह किसी और के साथ होता है?
जदौन

38

मेरे पास एक समान समस्या है, लेकिन स्वीकार किए गए उत्तर को पसंद नहीं किया क्योंकि यह केवल "नहीं मिला" त्रुटि के बजाय आदेशों से सभी त्रुटियों को दबाता है ।

हालाँकि, docker ps -q --filter "name=rabbitmq"केवल आउटपुट उत्पन्न करता है अगर उस नाम का एक कंटेनर वास्तव में मौजूद है, इसलिए टेस्ट से प्रेरित है अगर एक कमांड एक खाली स्ट्रिंग को आउटपुट करता है जो मैं साथ आया था:

docker ps -q --filter "name=rabbitmq" | grep -q . && docker stop rabbitmq && docker rm -fv rabbitmq

फ़िल्टर कमांड के परीक्षण के लिए निम्न कमांड भी उपयोगी है:

docker ps -q --filter "name=rabbitmq" | grep -q . && echo Found || echo Not Found

मेरा वास्तविक उपयोग मामला पहले से मौजूद कार्य में उत्पन्न नामों की सूची से सभी मौजूदा कंटेनरों (चाहे चल रहा हो या न हो) को हटाने वाले एक जोड़ी कार्य को करने में था:

- name: Check for containers that actually exist
  shell: 'docker ps -aq --filter "name={{ item }}"'
  with_items:
    - '{{ previous_command.stdout_lines }}'
  register: found_containers

- name: Remove the containers found by the above command
  shell: 'docker stop {{ item.item }} && docker rm -fv {{ item.item }}'
  with_items: '{{ found_containers.results }}'
  when: item.stdout

6
मुझे इसका उपयोग करना उपयोगी लगता है docker ps -aq ...-aविकल्प यह भी कंटेनर जो मौजूद हैं, लेकिन नहीं चल रहे हैं मिलेगा मतलब है।
पीटर ब्लूमफील्ड

बहुत बढ़िया जवाब, मैंने अभी इसका उपयोग bash script में किया है अगर यह पहले से चल रहा है तो docker कंटेनर को फिर से चालू करें। प्रयुक्त ps -aqरूप @PeterBloomfield ने सुझाव दिया और साथ ही,।
Psiloc

यदि कंटेनर नहीं मिला है, तो grep -q .एक गैर-अक्षीय अस्तित्व कोड भी है और इस प्रकार आपकी पूरी रेखा। तो यह अभी भी एक त्रुटि है। जो मुझे ऐसा करने के लिए मजबूर करेगा || echo 'not found'। और उस बिंदु पर स्वीकृत जवाब के लिए बहुत अंतर नहीं है
फेलिक्स बी।

समग्र कमांड रिटर्न कोड को प्रभावित करने वाले फ़िल्टर से बचने के लिए, आप इसे एक if स्टेटमेंट के रूप में if docker ps -q --filter "name=rabbitmq" | grep -q .; then docker stop rabbitmq && docker rm -fv rabbitmq; fi
रिफलेक्टर

23

अब कुछ समय के लिए docker का उपयोग कर रहे हैं। डॉकटर कंटेनर को रोकने और हटाने का यह मेरा पसंदीदा तरीका है। सच की पाइपिंग यह सुनिश्चित करने के लिए है कि यह हमेशा एक सफलता का उत्पादन करता है। इसके बिना, यदि कंटेनर नाम मौजूद नहीं था, तो कोई भी बैश स्क्रिप्ट बाहर निकल जाएगी और त्रुटि होगी।

docker rm -f container_name || true

11
docker rm -f container_name &>/dev/null && echo 'Removed old container'
फाइलमोनोव

docker कंटेनर rm | डॉक्यूमेंट डॉक्यूमेंटेशन : एक रनिंग कंटेनर को हटाने पर मजबूर करता है (SIGKILL का उपयोग करता है)
जेसन लॉ

13

आप उपयोग कर सकते हैं:

app="rabbitmq"
if docker ps | awk -v app="$app" 'NR > 1 && $NF == app{ret=1; exit} END{exit !ret}'; then
  docker stop "$app" && docker rm -f "$app"
fi
  • awkकमांड appको BASH के वैरिएबल से कमांड लाइन वर्जन मिलता है$app
  • NR>1docker psकमांड से पहली हेडर पंक्ति को छोड़ता है।
  • $(NF) == appपिछले कॉलम की तुलना NAMESऐप वेरिएबल के बराबर है या नहीं

नमस्ते यह काम करता है जवाब के लिए धन्यवाद। क्या आप इसका विस्तार कर सकते हैं कि इसका थोड़ा सा क्या है। अगर मेरे पास app = '' some-rabbitmq 'है तो यह हाइपेन को पसंद नहीं है?
रोबो_यूके

यह हाइफ़न के साथ काम करना चाहिए, मैं उत्तर में कुछ स्पष्टीकरण जोड़ रहा हूं।
अनुभा

1
एक समाधान के भी जटिल। दूसरा जवाब बेहतर है
स्कूटा पी

2
यह सबसे पूर्ण उत्तर है। `जोड़ने के साथ समस्या || true` यह है कि यह अभी भी docker त्रुटि के साथ एक bash स्क्रिप्ट मौजूद है। कंटेनर के लिए डॉक कंटेनर की सूची की जांच करके आप केवल कॉल स्टॉप और आरएम की गारंटी देते हैं यदि यह मौजूद है, त्रुटियों को समाप्त करने और स्क्रिप्ट को सभी कंटेनर कमांड को चलाने की अनुमति देता है।
AsAP_Sherb

7
# Stop and remove containers with names like "rabbitmq" and "rabbitmq123" if they exist
CONTAINER_NAME="rabbitmq"
OLD="$(docker ps --all --quiet --filter=name="$CONTAINER_NAME")"
if [ -n "$OLD" ]; then
  docker stop $OLD && docker rm $OLD
fi

4

मैं इस विवाद को बकवास में सुझाता हूं:

( docker stop $CONTAINER > /dev/null && echo Stopped container $CONTAINER && \
  docker rm $CONTAINER ) 2>/dev/null || true

यह हमेशा 0 से बाहर निकलता है, अगर कंटेनर नहीं चल रहा है, तो शिकायत नहीं करता है और Stopped container $CONTAINERअगर यह वास्तव में बंद हो जाता है तो प्रिंट करता है।


साफ आंसू, कि "विफल" चुपचाप अगर कोई कंटेनर नहीं मिला है, लेकिन अगर यह पाया जाता है चुपचाप stop/ rmकंटेनर नहीं करता है।
Emmagras


0

इस कोड को अपने script.sh में कॉपी करें यदि आप चाहते हैं stopऔर removeसभी

#!/bin/sh
ids=$(docker ps -a -q)
for id in $ids
do
  echo "$id"
  docker stop $id && docker rm $id
done

0

यदि आप अपने रुके हुए कंटेनरों को नहीं हटाते हैं, तो इसे संबोधित करने का एक और सरल तरीका है docker ps -a, जिस पर भरोसा करना है , जो हमेशा उस कंटेनर आईडी को लौटाएगा। फिर docker stopउस रुके हुए कंटेनर पर अमल करना केवल कुछ नहीं होगा:

docker stop $(docker ps -a --filter name= rabbitmq -q )


-2

सभी कंटेनरों को रोकने के लिए सबसे पहले आपको सभी कंटेनरों को बंद करना होगा

docker kill $(docker ps -q)

और सभी कंटेनरों को हटाने के लिए

docker rm $(docker ps -a -q)

और यदि आप सभी छवियों को हटाना चाहते हैं तो यह कमांड है

docker rmi $(docker images -q)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.