आप डॉकर की प्रक्रिया से कैसे जुड़ेंगे और अलग रहेंगे?


459

मैं एक डॉक प्रक्रिया में संलग्न हो सकता हूं लेकिन Ctrl+ cइससे अलग करने के लिए काम नहीं करता है। exitमूल रूप से प्रक्रिया को रोक देता है।

इस प्रक्रिया को चलाने के लिए अनुशंसित वर्कफ़्लो क्या है, कभी-कभी इसमें कुछ बदलाव करने के लिए इसे संलग्न किया जाता है, और फिर कोचिंग?


4
Nsenter का उपयोग करते समय, मैं सिर्फ Ctrl-D बाहर करता हूं।
user2105103

क्या बंद करना xterm, konsoleआदि काम करता है? यह मेरे लिए काम करता है (मैं अलग हो जाता हूं)।
व्येनतिस बिवाईनिस

जवाबों:


668

शेल से बाहर निकलने के बिना ट्टी को अलग करने के लिए, भागने के क्रम का उपयोग करें Ctrl+ के Pबाद Ctrl+ Q। अधिक जानकारी यहाँ

इस स्रोत से अतिरिक्त जानकारी :

  • docker run -t -i → ^P^Qडॉक अटैच के साथ और अलग किया जा सकता है
  • docker run -i → से अलग नहीं किया जा सकता ^P^Q; स्टड को बाधित करेगा
  • डॉक रन → के साथ अलग नहीं किया जा सकता है ^P^Q; ग्राहक ग्राहक कर सकते हैं; docker अटैच के साथ reattach कर सकते हैं

46
यह एक बड़ा जवाब होगा यदि यह वास्तव में डॉक्स में वर्णित के रूप में काम करता है।
एलिंगेक

20
मैंने पाया कि -it के साथ चलने पर भी, डिटैच अनुक्रम विफल हो जाता है यदि आप क्लिनअप फ्लैग (--rm) के साथ कंटेनर शुरू करते हैं। यह कुछ के लिए स्पष्ट हो सकता है, लेकिन यह मुझे अधिक बार काटता है जितना मैं स्वीकार करना चाहूंगा।
Allingeek

7
एक अन्य विकल्प सिर्फ अपनी टर्मिनल विंडो या cmd-w :) को बंद करना है
buildmaestro

3
आप "detachKeys": "ctrl-a,a"अपने .docker / config.json फ़ाइल में उदाहरण के लिए या --detach-keys "ctrl-a,a"अटैचमेंट के साथ कमांड लाइन पर आदि के साथ कॉन्फ़िगर करने योग्य डिटैच कीज़ सेट कर सकते हैं
मैथ्यू

4
Ctrl + Zअलग नहीं होता; यह सिर्फ प्रक्रिया को पृष्ठभूमि देता है। यह वैसा नहीं है जैसा कि प्रदर्शन दंड दिया जाता है।
ज़ेनेक्सर

178

भी की जाँच करें विकल्प :--sig-proxy

docker attach --sig-proxy=false 304f5db405ec

फिर CTRL+ cको अलग करने के लिए उपयोग करें


4
इसे अटैच करने के बजाय रन के साथ शुरू करने के लिए, मैंने कोशिश की: docker run -ti --sig-proxy=false busybox top जो काम नहीं करता है, इस प्रक्रिया को ctrl-c के साथ मार दिया जाता है, लेकिन docker run -t -sig-proxy=false busybox top काम के साथ शुरू करने और ctrl-c के साथ छोड़ने को सक्षम करने के लिए
हेनिंग

Ctrl-cकंटेनर को भी रोक देगा।
इवान हू

यह यहां सूचीबद्ध लोगों से एकमात्र समाधान है जो मेरे लिए डेबियन 9 सर्वर पर काम कर रहा है जो डॉकर 19.03.5 चल रहा है। सवाल यह है कि यह अटैच कमांड के लिए डिफ़ॉल्ट सेटिंग क्यों नहीं है? यह सबसे आम उपयोग मामला लगता है।
fviktor

Ctrl-p, Ctrl-q अनुक्रम मेरे लिए काम नहीं करता है (शुरू में docker कंटेनर संलग्न xyz के रूप में) .. लेकिन यह करता है। धन्यवाद @czerasz
प्रिवि नंदास

92

यदि आप केवल फ़ाइलों या प्रक्रियाओं का निरीक्षण करने के लिए कुछ संशोधन करना चाहते हैं, तो यहां एक और समाधान जो आप चाहते हैं।

आप मौजूदा कंटेनर से एक नई प्रक्रिया को निष्पादित करने के लिए निम्नलिखित कमांड चला सकते हैं:

sudo docker exec -ti [CONTAINER-ID] bash

बैश शेल के साथ एक नई प्रक्रिया शुरू करेंगे, और आप इसे सीधे Ctrl+ से बच सकते हैं C, यह मूल प्रक्रिया को प्रभावित नहीं करेगा।


6
यह काम किया है, आप मूल प्रक्रिया को प्रभावित किए बिना एक बार "बाहर निकलें" टाइप कर सकते हैं।
Eko3alpha

यह एक चल रहे कंटेनर को संलग्न करने का एक शानदार तरीका है। लेकिन क्या होगा अगर (कहते हैं) मेरे पास कंटेनर में कुछ प्रक्रिया चल रही है और मैं उस प्रक्रिया को फिर से शुरू करना चाहता हूं? आह, मैं सिर्फ पुरानी प्रक्रिया को मार सकता हूं, नए को फिर से शुरू कर सकता हूं, और सीपी, सीक्यू का उपयोग कर सकता हूं, जो काम करता है क्योंकि यह एक इंटरेक्टिव ट्टी है। मुझे --sig -xy = झूठी विधि भी पसंद है, लेकिन यह अधिक बहुमुखी है और वर्तमान प्रक्रिया के विघटन को मजबूर नहीं करता है।
तरणकी

"अटैचमेंट" का डोकर के साथ एक विशिष्ट अर्थ है, और execयह नहीं है।
frnhr

48

मुझे लगता है कि यह स्थिति पर निर्भर होना चाहिए। निम्न कंटेनर को एक उदाहरण के रूप में लें:

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         5 seconds ago       Up 4 seconds                            serene_goldstine

(1) docker attachकंटेनर को संलग्न करने के लिए " " का उपयोग करें :

चूंकि " docker attach" एक नया ट्टी आवंटित नहीं करेगा , लेकिन मूल रनिंग ट्टी का पुन: उपयोग करता है, इसलिए यदि आप exitकमांड चलाते हैं, तो यह चल रहे कंटेनर के बाहर निकलने का कारण होगा:

# docker attach 91262536f7c9
exit
exit
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         39 minutes ago      Exited (0) 3 seconds ago                       serene_goldstine

इसलिए जब तक आप वास्तव में रनिंग कंटेनर निकास नहीं बनाना चाहते हैं, आपको Ctrl+ p+ Ctrl+ का उपयोग करना चाहिए q

(२) " docker exec" का प्रयोग करें

के बाद से " docker exec" होगा एक नया tty आवंटित है, इसलिए मुझे लगता है कि आप का उपयोग करना चाहिए exitके बजाय Ctrl+ p+ Ctrl+ q

कंटेनर छोड़ने के लिए निम्नलिखित Ctrl+ p+ Ctrl+ निष्पादित कर रहा है q:

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss   04:03   0:00 bash
root        28  0.0  0.0  15564  1148 ?        R+   04:03   0:00 ps -aux
root@91262536f7c9:/# echo $$
15

फिर कंटेनर को फिर से लॉगिन करें, आप देखेंगे कि bashप्रचार में प्रक्रिया docker execअभी भी जीवित है (पीआईडी ​​15 है):

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss+  04:03   0:00 bash
root        29  0.0  0.0  18164  1888 ?        Ss   04:04   0:00 bash
root        42  0.0  0.0  15564  1148 ?        R+   04:04   0:00 ps -aux
root@91262536f7c9:/# echo $$
29

39

एक चल कंटेनर से अलग करने के लिए, उपयोग ^P^Q(पकड़ Ctrl, प्रेस P, प्रेस Q, रिलीज Ctrl)।

एक पकड़ है: यह केवल तभी काम करता है जब कंटेनर को दोनों के साथ शुरू किया गया था -tऔर -i

यदि आपके पास एक चालू कंटेनर है जो इन विकल्पों में से एक (या दोनों) के बिना शुरू किया गया था, और आप के साथ संलग्न हैं docker attach, तो आपको अलग करने का एक और तरीका खोजना होगा। आपके द्वारा चुने गए विकल्पों और आपके द्वारा चलाए ^Cजा रहे प्रोग्राम के आधार पर, यह काम कर सकता है या यह पूरे कंटेनर को मार सकता है। आपको प्रयोग करना पड़ेगा।

एक और पकड़: आपके द्वारा उपयोग किए जा रहे कार्यक्रमों के आधार पर, आपके टर्मिनल, शेल, एसएसएच क्लाइंट, या मल्टीप्लेक्सर ^Pया तो इंटरसेप्टिंग या ^Q(आमतौर पर बाद वाले) हो सकते हैं। यह जांचने के लिए कि क्या यह समस्या है, --detach-keys zतर्क के साथ चलने या संलग्न करने का प्रयास करें । अब आपको zबिना किसी संशोधक के, दबाकर अलग करना चाहिए । यदि यह काम करता है, तो एक और कार्यक्रम हस्तक्षेप कर रहा है। इसके चारों ओर काम करने का सबसे आसान तरीका है कि आप अपने स्वयं के अलग-अलग अनुक्रम को --detach-keysतर्क का उपयोग करके सेट करें । (उदाहरण के लिए, के साथ बाहर निकलने के लिए ^K, का उपयोग करें --detach-keys 'ctrl-k'।) वैकल्पिक रूप से, आप अपने टर्मिनल या अन्य हस्तक्षेप कार्यक्रम में कुंजियों के अवरोधन को अक्षम करने का प्रयास कर सकते हैं। उदाहरण के लिए, stty start ''या stty start undefटर्मिनल को अवरोधन से रोका जा सकता है^Q कुछ POSIX सिस्टम पर, हालांकि मुझे यह मददगार नहीं लगा।


2
सुपर सटीक स्पष्टीकरण, एक आकर्षण की तरह काम किया
मीर गाबे

27

जब कुछ और काम न करे, तब एक नया टर्मिनल खोलें :

$ ps aux | grep attach
username  <pid_here>    ..............  0:00 docker attach <CONTAINER_HASH_HERE>
username  <another_pid> ..............  0:00 grep --color=auto attach
$ kill -9 <pid_here>

क्या जाल है! धन्यवाद, यह केवल एक चीज है जिसने काम किया है। -9जरूरी नहीं था।
हीथ राफ्टी

यह कंटेनर को भी मारता है - शायद निर्भर करता है कि कौन से झंडे लगाए गए थे।
एडमल

1
कृपया ध्यान दें कि यदि दो ग्रिड प्रदर्शित हैं तो पहला अभिभावक है। आपको मारने के लिए दूसरे पिड का इस्तेमाल करना चाहिए docker attachन कि उसके माता-पिता को।
joeytwiddle

11

कंटेनर आप बस पकड़ से अलग करने के लिए Ctrlऔर प्रेस P+ Q

आपके द्वारा उपयोग किए जा रहे कंटेनर को संलग्न करने के लिए:

$ docker container attach "container_name"

9

मैं एक ही मुद्दा था, ctrl- Pऔर Qकाम नहीं होगा, और न ही ctrl- C... अंत में मैं एक टर्मिनल सत्र खोला और मैं "डोकर बंद किया containerid " और "डोकर शुरू containerid " और यह काम किया गया। अजीब।


यदि आप --rmध्वज के साथ कंटेनर प्रारंभ करते हैं तो यह काम नहीं करेगा । Ctrl+Pऔर Ctrl+Qकाम करता है अगर आपने -itझंडे के साथ कंटेनर शुरू किया ।
अस्वथ K

4

उसी शेल में, ctrlकुंजी दबाए रखें और pफिर कुंजी दबाएँq


3
यह केवल तभी काम करता है जब आपने -itध्वज के साथ कंटेनर शुरू किया हो ।
अस्वथ K



0

एक डॉकटर प्रक्रिया को रोकने और बंदरगाहों को छोड़ने के लिए , पहले उपयोग करें ctrl- cबाहर निकलने वाले कंटेनर को छोड़ने के लिए फिर डॉकिंग पीएस का उपयोग करें ताकि रनिंग कंटेनर की सूची का पता लगाया जा सके। फिर आप उस प्रक्रिया को रोकने और इसके पोर्ट को रिलीज़ करने के लिए docker कंटेनर स्टॉप का उपयोग कर सकते हैं। कंटेनर का नाम आपको docker ps कमांड से मिल सकता है जो नाम कॉलम में नाम देता है। आशा है कि यह आपके प्रश्नों को हल करता है ...।


0

यदि आपको पृष्ठभूमि में जाने के लिए केवल docker प्रक्रिया की आवश्यकता है तो आप उपयोग कर सकते हैं

Ctrl + Z

ज्ञात हो कि यह वास्तविक टुकड़ी नहीं है और यह एक प्रदर्शन दंड के साथ आता है। (आप इसे अग्रभूमि के साथ वापस कर सकते हैंbg कमांड के )।

एक अन्य विकल्प सिर्फ अपने टर्मिनल को बंद करना है, अगर आपको इसकी आवश्यकता नहीं है।


0

किसी के लिए जो उसी समस्या में भाग गया, जो मैंने किया (कंटेनर की हत्या किए बिना अलग नहीं कर सकता, यहां तक ​​कि जब अलग-अलग कुंजी सेट करता है) ......

अपने कंटेनरों को शुरू करते समय docker-compose up -d

के बजाय का उपयोग करने का docker attach {container name}पूँजी लॉग देखने के लिए करने के ....

कोशिश करो docker-compose logs -f {service name} ctrl-c अपने कंटेनर को मारने के बिना लॉग पूंछ को मारता है

{service name} आपके docker-compose.yml फ़ाइल के पक्ष में सूचीबद्ध सेवा होने के नाते। (जैसे कंटेनर नाम = elk_logstash_1 -> सेवा का नाम = logstash

HTH


0

अपडेट करें

मैं आमतौर पर डॉकटर संलग्न करता था कि समस्या निवारण कंटेनरों के लिए STDOUT क्या प्रदर्शित कर रहा था। मुझे अभी मिलाdocker logs --follow 621a4334f97b , जो मुझे STDOUT को देखने देता है, जबकि कंटेनर ऑपरेशन को प्रभावित किए बिना इसे ctrl + c से बंद करने में सक्षम है! बिल्कुल वही जो मैंने हमेशा चाहा है।

... स्वाभाविक रूप से आपको अपने कंटेनर आईडी में सबस्टीट्यूट करना होगा।

मूल उत्तर

मैं कंटेनर को छोड़ना चाहता था, लेकिन कंटेनर को बिना स्टार्ट किए ही जुड़ा था -it। मेरा समाधान इसके बजाय अपने SSH कनेक्शन का त्याग करना था (क्योंकि मैं उस मशीन में SSHed था जो कंटेनर चला रहा था)। कि ssh सत्र को मारना कंटेनर को बरकरार रखा लेकिन मुझे इससे अलग कर दिया।

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