बिना रुके कंटेनर से अलग करने का सही तरीका


313

डॉकर 1.1.2 (नवीनतम) में, कंटेनर को बिना रुके अलग करने का सही तरीका क्या है?

उदाहरण के लिए, अगर मैं कोशिश करूँ:

  • docker run -i -t foo /bin/bash या
  • docker attach foo (पहले से चल रहे कंटेनर के लिए)

जो दोनों मुझे कंटेनर में एक टर्मिनल में ले जाते हैं, मैं कंटेनर के टर्मिनल को बिना रोकें कैसे बाहर निकलूं?

exitऔर CTR+Cदोनों कंटेनर को रोकते हैं।


"कंटेनर" केवल प्रतिबंधित नेमस्पेस (एक प्रोसेस नेमस्पेस, एक फाइल सिस्टम नेमस्पेस, आदि) का एक सेट है जो प्रक्रियाएं चल सकती हैं। यदि आपके पास किसी नामस्थान के अंदर कोई प्रक्रिया नहीं है, तो क्या वास्तव में नामस्थान मौजूद हैं? यह एक वर्चुअल मशीन की तरह नहीं है जहाँ घड़ी की गड़बड़ी का जवाब देने वाला एक कर्नेल है। परवाह किए बिना।
चार्ल्स डफी

जवाबों:


166

अद्यतन: के रूप में जवाब नीचे में उल्लेख किया है Ctrl+ p, Ctrl+ qअब डेमॉन मोड में इंटरैक्टिव मोड बदल जाएगा।


अच्छी तरह से Ctrl+ C(या Ctrl+ \) आपको कंटेनर से अलग करना चाहिए लेकिन यह कंटेनर को मार देगा क्योंकि आपकी मुख्य प्रक्रिया बैश है।

डॉकटर के बारे में थोड़ा सबक। कंटेनर एक वास्तविक पूर्ण कार्यात्मक ओएस नहीं है। जब आप एक कंटेनर चलाते हैं तो आपके द्वारा लॉन्च की जाने वाली प्रक्रिया PID 1 को ले जाती है और init पावर ग्रहण करती है। इसलिए जब उस प्रक्रिया को समाप्त कर दिया जाता है तो डेमॉन कंटेनर को रोक देता है जब तक कि एक नई प्रक्रिया लॉन्च न हो जाए (docker start के माध्यम से) (मामले की अधिक व्याख्या http://phusion.github.io/baseimage-docker/#intro )

यदि आप एक कंटेनर चाहते हैं जो हर समय अलग मोड में चलता है, तो मैं आपको उपयोग करने का सुझाव देता हूं

docker run -d foo

कंटेनर पर एक ssh सर्वर के साथ। (आसान तरीका है डॉक्यूमेंटिंग ओपनशेक ट्यूटोरियल https://docs.docker.com/engine/examples/running_ssh_service/ को फॉलो करना )

या आप बस के माध्यम से अपने कंटेनर relaunch कर सकते हैं

docker start foo

(यह डिफ़ॉल्ट रूप से अलग हो जाएगा)


3
आधार-कर्ता के लिए +1। यह जानना शानदार है कि डॉकर के कठिन हिस्सों के बारे में सलाह के साथ एक टेम्पलेट है।
mtmacdonald

ध्यान दें कि ssh सख्ती से आवश्यक नहीं है: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
Adrian

1
एक में -d मोड को चलाना बहुत मददगार था। इसके अलावा, डॉकरफाइल के माध्यम से ssh शुरू करने के लिंक ने मेरे जीवन को आसान बना दिया।
रवि

56
Ctrl-p, Ctrl-q का उपयोग करके अलग करें। इस जवाब की सलाह एक कंटेनर को मार देगी।
तरणाकी

4
साथ प्रारंभ: यह मेरे लिए काम किया (नीचे उत्तर से लिया गया) -ti -d, तो साथ देते हैं docker attach, तो साथ अलग पहले Ctrl + P और फिर Ctrl + Q। मैंने सोचा, मैं कीबोर्ड शॉर्टकट्स में से केवल एक का उपयोग कर सकता हूं।
CGFoX

526

टाइप करें Ctrl+ pफिर Ctrl+ q। यह इंटरैक्टिव मोड को डेमॉन मोड में बदलने में आपकी मदद करेगा।

Https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shell देखें ।

# To detach the tty without exiting the shell,
# use the escape sequence Ctrl-p + Ctrl-q
# note: This will continue to exist in a stopped state once exited (see "docker ps -a")

4
इसके साथ काम नहीं करने के लिए लगता है (एक संलग्न Wekan कंटेनर से बाहर निकलने की कोशिश कर रहा है)।
खतरा 89

7
मैंने इस पृष्ठ पर इतनी बार दौरा किया है क्योंकि मुझे इस कुंजी संयोजन को ठीक से याद नहीं है! :
थम्मे गौड़ा

10
@ dang89 ctrl-p, ctrl-q केवल तभी काम करेगा जब आपने अपना कंटेनर इंटरेक्टिव मोड (-it) के साथ शुरू किया हो। यदि आपने इसे बहरीन मोड (-d) में शुरू किया है और इसे संलग्न किया है, तो आप इसे बाहर निकाल सकते हैं और यह अभी भी पृष्ठभूमि में चलेगा।
रिस्की

1
@SlimShady बाहर निकलने के लिए Ctrl + P दबाएं, Ctrl + Q उनमें से एक नहीं, बल्कि उस क्रम में दोनों।
मोहिद्दीन अलाउद्दीन

160

मैंने इस पर ध्यान दिया और उपरोक्त सभी उत्तर आंशिक रूप से सही हैं। यह सब इस बात पर निर्भर करता है कि कंटेनर को कैसे लॉन्च किया जाता है। जब कंटेनर लॉन्च किया गया था, तो यह नीचे आता है:

  • एक TTY आवंटित किया गया था ( -t)
  • स्टड खुला छोड़ दिया गया था ( -i)

^P^Q काम करता है, लेकिन केवल जब -tऔर-i कंटेनर शुरू करने के लिए प्रयोग किया जाता है:

[berto@g6]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q
read escape sequence

# i'm back to my prompt
[berto@g6]$ docker kill test; docker rm -v test
test
test

ctrl+c काम करता है, लेकिन केवल जब -t( -i कंटेनर को लॉन्च करने के लिए बिना ) उपयोग किया जाता है:

[berto@g6]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d

[berto@g6]$ docker attach test
^C

[berto@g6]$    

अलग करने का तीसरा तरीका

कंटेनर को मारने के बिना अलग करने का एक तरीका है; आपको एक और शेल की जरूरत है। सारांश में, इसे दूसरे शेल में अलग किया गया और कंटेनर को छोड़ दिया गया pkill -9 -f 'docker.*attach':

[berto@g6]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q and doesn't work
^P
# ctrl+c doesn't work either
^C
# can't background either
^Z

# go to another shell and run the `pkill` command above

# i'm back to my prompt
[berto@g6]$

क्यों? क्योंकि आप उस प्रक्रिया को मार रहे हैं जो आपको कंटेनर से जोड़ती है, कंटेनर को नहीं।


2
तीसरा रास्ता मेरे लिए काम करता है। धन्यवाद। यदि आप कई उदाहरणों से जुड़ रहे हैं और केवल एक से अलग होना चाहते हैं। विशिष्ट प्रक्रिया को मार सकता है: ps -ef | grep संलग्न करें -> pid प्राप्त करें। फिर: किल -9 <pid>
phanhuy152

pkill केवल एक चीज है जो मेरे लिए काम करती है
docker

हमें -9 की आवश्यकता क्यों है? मैंने देखा कि अगर हम -9 का उपयोग न करें तो यह कंटेनर को बंद कर देता है।
एंजेलो

अन्य संकेत हैं, संकेत। वे प्रक्रिया को बताते हैं कि किस प्रकार का संकेत है और इसे कार्य करने और कुछ करने का मौका देता है। kill -9संकेत नहीं करता है। प्रक्रिया को समाप्त कर दिया गया है और इसकी कोई पुनरावृत्ति नहीं है। मेरा अनुमान है कि अन्य सिग्नल कंटेनर को बंद करने का मौका देते हैं, जबकि -9ऐसा नहीं है।
बर्टो

1
यह सुपर सहायक था। धन्यवाद!
इवान ज़मीर

40

यदि आप करते हैं "डोकर देते हैं" कंटेनर आईडी "आप कंटेनर में मिलता है। कंटेनर आप दर्ज करने की आवश्यकता को रोके बिना कंटेनर से बाहर निकलने के लिए Ctrl+ P+Q


6
Ctrl + P और Ctrl + Q
sib10

4
Ctrl + P, Q (अभी भी Ctrl पकड़े हुए;)
dimpiax

यह मुझे लौटाता है:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
वेबमेन

31

मैं अश्विन के जवाब को सबसे सही मानता हूं, मेरा पुराना जवाब नीचे है।


मैं यहां एक और विकल्प जोड़ना चाहूंगा जो कंटेनर को निम्न प्रकार से चलाना है

docker run -dti foo bash

फिर आप कंटेनर में प्रवेश कर सकते हैं और बैश चला सकते हैं

docker exec -ti ID_of_foo bash

कोई sshd स्थापित करने की आवश्यकता :)


मुझे लगता है कि दूसरे आदेश में आपको फू के कंटेनर आईडी के साथ फू को बदलने की आवश्यकता है
नेहल जे वानी

इस संदर्भ में, मुझे लगता docker attachहै कि पहले बैश रन के लिए पुन: प्रशिक्षण द्वारा अधिक मानक होगा। docker execयहां भी काम करता है, हालांकि यह पहले वाले के अलावा एक नई बैश प्रक्रिया बनाता है। निश्चित रूप से, प्रक्रिया एक ही संदर्भ / पर्यावरण / पहले एक कंटेनर के भीतर बनाई गई है, हालांकि यह एक अलग है (आपके पसंदीदा टर्मिनल एमुलेटर में एक नया टर्मिनल टैब खोलने के लिए एक सादृश्य होगा)।
थियागॉफ़एक्स

20

एक इंटरैक्टिव कंटेनर से अलग करने का डिफ़ॉल्ट तरीका Ctrl+ P Ctrl+ है Q, लेकिन आप नया कंटेनर चलाते समय या मौजूदा कंटेनर को --detach-keys ध्वज का उपयोग करके इसे ओवरराइड कर सकते हैं ।


16

यदि आप के माध्यम से संलग्न हैं docker attach, तो आप docker संलग्न प्रक्रिया को मारकर अलग कर सकते हैं। अपने कंटेनर में Ctrl + C पास करने से बचने के लिए sig -xy पैरामीटर का उपयोग करने का बेहतर तरीका है:

docker attach --sig-proxy=false [container-name]

docker runकमांड के लिए समान विकल्प उपलब्ध है ।


6
हालांकि --sig -xy = false बेहद उपयोगी है, यह पहले से ही अटैच कंटेनर के लिए काम नहीं करता है जिसके लिए यह निर्दिष्ट नहीं किया गया था। समस्या यह है कि, अटैचमेंट को बिना किसी प्रक्रिया के मारने का कोई तरीका नहीं लगता, जिसमें "डोकर अटैच प्रक्रिया को मारना" भी शामिल है। Cp, Cq संलग्न कंटेनरों के साथ काम नहीं करता है, केवल इंटरएक्टिव वाले (जैसे प्रश्न का उपयोग करता है)।
तरणकी

1
यह स्वीकृत उत्तर होना चाहिए, जिसमें @taranaki की टिप्पणी, Ctrl + P, Q काम नहीं करता हैphp:7.3-apache
MKaama

10

यदि आप बस कंटेनर के भीतर से चल रही प्रक्रिया का आउटपुट देखना चाहते हैं, तो आप एक सरल कार्य कर सकते हैं docker container logs -f <container id>

-fफ़्लैग कर देता है, ताकि कंटेनर के उत्पादन में किया जाता है followedऔर वास्तविक समय में अद्यतन किया गया। डिबगिंग या निगरानी के लिए बहुत उपयोगी है।


8

--detach-keysजब आप docker attachडिफ़ॉल्ट CTRL+ P, CTRL+ Qअनुक्रम को ओवरराइड करने के लिए चलाते हैं तो आप विकल्प का उपयोग कर सकते हैं (जो हमेशा काम नहीं करता है)।

उदाहरण के लिए, जब आप दौड़ते हैं docker attach --detach-keys="ctrl-a" testऔर आप CTRL+ दबाते हैं Aतो आप कंटेनर से बाहर निकल जाएंगे, उसे मारे बिना।

अन्य उदाहरण:

  • docker attach --detach-keys="ctrl-a,x" test- प्रेस करें CTRL+Aऔर फिर Xबाहर निकलने के लिए
  • docker attach --detach-keys="a,b,c" test- प्रेस करें A, फिर B, फिर Cबाहर निकलने के लिए

आधिकारिक दस्तावेज से उद्धरण:

यदि आप चाहें, तो आप डॉक की कुंजी अनुक्रम को अलग करने के लिए ओवरराइड को कॉन्फ़िगर कर सकते हैं। यह उपयोगी है यदि डॉकर डिफ़ॉल्ट अनुक्रम अन्य अनुप्रयोगों के लिए आपके द्वारा उपयोग किए जाने वाले प्रमुख अनुक्रम के साथ संघर्ष करता है। प्रति कंटेनर ओवरराइड के रूप में या आपके संपूर्ण कॉन्फ़िगरेशन पर कॉन्फ़िगरेशन प्रॉपर्टी के रूप में आपके अपने अलग-अलग कुंजी अनुक्रम को परिभाषित करने के दो तरीके हैं।

एक व्यक्तिगत कंटेनर के लिए अनुक्रम को ओवरराइड करने के लिए, --detach-keys="<sequence>"डॉक संलग्न कमांड के साथ ध्वज का उपयोग करें । का प्रारूप <sequence>या तो एक पत्र है [a-Z], या ctrl-निम्न में से किसी के साथ संयुक्त है:

  • एज़ (एक एकल लोअरकेस अल्फा वर्ण)
  • @ (चिह्न पर)
  • [(बाएं कोष्ठक)
  • \ (दो पिछड़े स्लैश)
  • _ (अंडरस्कोर)
  • ^ (कार्यवाहक)

ये a, ctrl-a, X, या ctrl-\\मान मान्य कुंजी दृश्यों के उदाहरण हैं। सभी कंटेनरों के लिए एक अलग कॉन्फ़िगरेशन डिफ़ॉल्ट कुंजी अनुक्रम कॉन्फ़िगर करने के लिए, कॉन्फ़िगरेशन फ़ाइल अनुभाग देखें।

नोट: यह डॉक वर्जन १.१०+ के बाद से काम करता है (इस उत्तर के समय, वर्तमान संस्करण १ ).०३ है)


0

पुरानी पोस्ट लेकिन बस बाहर निकलें फिर इसे फिर से शुरू करें ... मुद्दा यह है कि यदि आप एक विंडोज़ मशीन पर हैं तो Ctrl p या Ctrl P प्रिंट करने के लिए बंधा हुआ है ... कंटेनर को शुरू करने से बाहर निकलने से कुछ भी नुकसान नहीं होना चाहिए

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