"डॉक रन-डी" के बाद डोकर कंटेनर अपने आप बंद हो जाएगा


333

अब तक पढ़े गए ट्यूटोरियल के अनुसार, docker run -dइमेज से कंटेनर का उपयोग शुरू हो जाएगा और बैकग्राउंड में कंटेनर चलेगा। यह कैसा दिखता है, हम देख सकते हैं कि हमारे पास पहले से ही कंटेनर आईडी है।

root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

लेकिन अगर मैं " docker ps" भागा , तो कुछ भी नहीं लौटाया गया।

इसलिए मैंने " docker ps -a" की कोशिश की , मैं कंटेनर को पहले से ही देख सकता हूं:

root@docker:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

कुछ भी मैंने गलत किया? मैं इस समस्या का निवारण कैसे कर सकता हूं?


1
"docker run hello-world" <== पूरी तरह से काम करता है, लेकिन अगर मैं "docker run -d hello-world" चलाता हूं, तो भी मुझे रनिंग कंटेनर नहीं मिल सकता है।
जे जॉन

5
मेरे पास एक समान मुद्दा था, लेकिन मुझे इसका उपयोग करके काम करना docker run -it -d <image> /bin/bashशुरू हुआ, यह एक बैश शेल को अंतःक्रियात्मक रूप से शुरू करता है और कंटेनर को बंद नहीं करता है क्योंकि शेल प्रक्रिया सक्रिय है।
Rtsne42

जवाबों:


495

Centos dockerfile एक डिफ़ॉल्ट आदेश है bash

इसका मतलब है, जब पृष्ठभूमि में चलाया जाता है ( -d), शेल तुरंत बाहर निकलता है।

अपडेट 2017

डोकर अधिकृत की अधिक हाल के संस्करण दोनों में एक कंटेनर को चलाने के लिए अलग मोड और में अग्रभूमि मोड ( -t, -iया -it)

उस स्थिति में, आपको किसी अतिरिक्त आदेश की आवश्यकता नहीं है और यह पर्याप्त है:

docker run -t -d centos

बैश बैकग्राउंड में इंतजार करेंगे।
यह शुरू में कल्याणी-चौधरी के उत्तर में बताया गया था और जर्सी बीन के उत्तर में विस्तृत था ।

vonc@voncvb:~$ d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4a50fd9e9189        centos              "/bin/bash"         8 seconds ago       Up 2 seconds                            wonderful_wright

ध्यान दें कि अल्पाइन के लिए , Marinos टिप्पणियों में एक रिपोर्ट :

docker run -t -d alpine/gitप्रक्रिया को बनाए नहीं रखता है।
करना था:docker run --entrypoint "/bin/sh" -it alpine/git


मूल उत्तर (2015)

जैसा कि इस लेख में बताया गया है :

साथ चलने के बजाय docker run -i -t image your-command, उपयोग करने -dकी अनुशंसा की जाती है क्योंकि आप अपने कंटेनर को सिर्फ एक कमांड से चला सकते हैं और आपको Ctrl+ P+ मारकर कंटेनर के टर्मिनल को अलग करने की आवश्यकता नहीं है Q

हालांकि, -dविकल्प के साथ एक समस्या है। आपका कंटेनर तुरंत बंद हो जाता है जब तक कि कमांड्स अग्रभूमि पर नहीं चल रहे हों
डॉकर को अग्रभूमि में चलते रहने के लिए आपकी आज्ञा की आवश्यकता होती है। अन्यथा, यह सोचता है कि आपके एप्लिकेशन बंद हो जाते हैं और कंटेनर को बंद कर देते हैं।

समस्या यह है कि कुछ एप्लिकेशन अग्रभूमि में नहीं चलते हैं। हम इसे कैसे आसान बना सकते हैं?

इस स्थिति में, आप tail -f /dev/nullअपने आदेश में जोड़ सकते हैं ।
ऐसा करने से, भले ही आपका मुख्य कमांड बैकग्राउंड में चलता हो, आपका कंटेनर रुकता नहीं है क्योंकि पूंछ अग्रभूमि में चलती रहती है।

तो यह काम करेगा:

docker run -d centos tail -f /dev/null

A docker psअभी भी चल रहे सेंटोस कंटेनर को दिखाएगा।

वहां से, आप इसे संलग्न कर सकते हैं या इसे (या docker execकुछ कमांड) से अलग कर सकते हैं


क्षमा करें, एक और सवाल, मेरे पास स्टार्टअप पर चलने के लिए एक स्क्रिप्ट की आवश्यकता है, /etc/rc.d/rc.local की तरह दिखता है अब काम नहीं करता है (मेरी मानसिकता अभी भी ओएस की तरह डॉकटर का इलाज कर रही है), मुझे लगता है कि डॉक फ़ाइल इसमें बेहतर विकल्प है मामला?
जे जॉन

5
@GuruprasadGV अपेक्षित है। डॉकटर अटैच करने के बजाय उपयोग करें docker exec -it <yourContainer> bash
VonC

3
यदि आप किसी प्रविष्टि बिंदु फ़ाइल के अंत में टेल कमांड जोड़ते हैं तो भी यह काम करता है।
यारा

2
मैंने अपने अंतिम (लंबे समय तक चलने) कमांड के रूप में sshd का उपयोग किया। तब आप अपने कंटेनर पर भी शश कर सकते हैं क्योंकि आप एक वीएम पर (एक बार जब आप .ssh / अधिकृत_कीप आदि को सेट करते हैं) ... तो आप ansible का उपयोग करके कंटेनर को कॉन्फ़िगर करने के लिए भी जा सकते हैं।
andrew pate

1
मैंने अपनी कमांड के साथ-साथ ऊपर सूचीबद्ध पुराने फ़िक्स को निष्पादित करने के लिए इसे समाप्त किया: docker run image_name / bin / bash -c "my / command && tail -f / dev / null"
Geordie

58

इस उत्तर के अनुसार , -tझंडे को जोड़ने से कंटेनर को पृष्ठभूमि में चलने से बाहर निकलने से रोका जा सकेगा। फिर आप docker exec -i -t <image> /bin/bashशेल प्रॉम्प्ट में जाने के लिए उपयोग कर सकते हैं ।

docker run -t -d <image> <command>

ऐसा लगता है कि -t विकल्प को बहुत अच्छी तरह से प्रलेखित नहीं किया गया है , हालांकि मदद कहती है कि यह "एक छद्म-TTY आवंटित करता है।"


10
अच्छा लगा। लगता है की तुलना में कम hacky लगता हैtail -f /dev/null
Scarysize

धन्यवाद! स्लिम मौका पर यह किसी की मदद करता है, यह Emacs Eshell में अच्छी तरह से व्यवहार नहीं करता है।
पीटर बेसिक

2
docker run -t -d --name mysql -p 3306:3306 mysql- मेरे लिए काम नहीं करता (ubuntu 14.04.5): STATUS = बाहर निकल (1) 4 सेकंड पहले
Putnik

मैंने पाया कि जब तक आप चाहें, आपको यहां <कमांड> की आवश्यकता नहीं है। अजीब तरह से, यह -i (इंटरैक्टिव) के साथ -t को बदलने के लिए भी काम करता है। डॉक्टर -t और -i संयुक्त का उपयोग करते हुए उल्लेख करता है एक खोल की तरह व्यवहार करेगा।
जर्सी बीन

43

पृष्ठभूमि

एक डॉकर कंटेनर एक प्रक्रिया ("कमांड" या "एंट्रीपॉइंट") चलाता है जो इसे जीवित रखता है। जब तक कमांड चलता रहेगा कंटेनर चलता रहेगा।

आपके मामले में, कमांड ( /bin/bash, डिफ़ॉल्ट रूप से, centos:latest) तुरंत बाहर निकल रहा है (जैसा कि बैश तब करता है जब वह टर्मिनल से जुड़ा नहीं होता है और उसके पास चलाने के लिए कुछ भी नहीं है)।

आम तौर पर, जब आप डेमन मोड (साथ -d) में कंटेनर चलाते हैं, तो कंटेनर कुछ प्रकार की डेमन प्रक्रिया (जैसे httpd) चला रहा होता है । इस मामले में, जब तक httpd डेमन चल रहा है, तब तक कंटेनर जीवित रहेगा।

आप जो करने की कोशिश करते दिखाई देते हैं वह कंटेनर को डैनॉन प्रक्रिया के बिना जीवित रखने के लिए होता है। यह कुछ अजीब है (क्योंकि कंटेनर कुछ भी उपयोगी नहीं है जब तक कि आप इसके साथ बातचीत नहीं करते हैं, शायद इसके साथ docker exec), लेकिन कुछ ऐसे मामले हैं जहां यह कुछ ऐसा करने के लिए समझ में आता है।

(क्या आपका मतलब कंटेनर के अंदर बैश प्रॉम्प्ट से है? यह आसान है! docker run -it centos:latest)

समाधान

डेमॉन मोड में एक कंटेनर को अनिश्चित काल तक जीवित रखने का एक सरल तरीका sleep infinityकंटेनर की कमान के रूप में चलना है । यह डेमॉन मोड में TTY आवंटित करने जैसी अजीब चीजों पर निर्भर नहीं करता है। हालांकि यह sleepआपकी प्राथमिक कमांड के रूप में उपयोग करने जैसी अजीब चीजों पर निर्भर करता है ।

$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID  IMAGE         COMMAND          CREATED       STATUS       PORTS NAMES
d651c7a9e0ad  centos:latest "sleep infinity" 2 seconds ago Up 2 seconds       nervous_visvesvaraya

दूसरा तरीका

जैसा कि cjsimon द्वारा इंगित किया गया है, -tविकल्प एक "छद्म ट्टी " आवंटित करता है। यह ट्रिक अनिश्चित काल तक चलने में बाधक है क्योंकि यह सोचता है कि यह एक इंटरैक्टिव TTY से जुड़ा है (भले ही आपके पास पास न हो तो उस विशेष TTY के साथ बातचीत करने का कोई तरीका नहीं है -i)। वैसे भी, यह चाल भी करना चाहिए:

$ docker run -t -d centos:latest

100% यकीन नहीं है कि क्या -tअन्य अजीब बातचीत का उत्पादन करेगा; हो सकता है अगर यह नीचे एक टिप्पणी छोड़ दें।


ध्यान रखें कि यह अल्पाइन पर काम नहीं करता है क्योंकि बिजीबॉक्स की नींद स्वीकार नहीं करती है infinity
जॉन कुगेलमैन

इसने मुझे एक अमेज़ॅन-लाइनक्स छवि का समस्या निवारण करने में मदद की, धन्यवाद
प्रभावी

18

हाय यह मुद्दा है क्योंकि कंटेनर में कोई चल रहे एप्लिकेशन नहीं होने पर डॉकटर कंटेनर बाहर निकल जाते हैं।

-d 

विकल्प सिर्फ बहरीन मोड में एक कंटेनर चलाने के लिए है।

तो अपने कंटेनर को लगातार चलाने की चाल डॉक में एक शेल फ़ाइल की ओर इशारा करती है जो आपके एप्लिकेशन को चालू रखेगा। आप एक .sh फ़ाइल के साथ प्रयास कर सकते हैं

Eg: docker run -d centos sh /yourlocation/start.sh

यह start.sh को कभी समाप्त न होने वाले अनुप्रयोग की ओर संकेत करना चाहिए।

यदि आप किसी एप्लिकेशन को नहीं चलाना चाहते हैं, तो आप इंस्टॉल कर सकते हैं monitजो आपके डॉकटर कंटेनर को चालू रखेगा। कृपया हमें बताएं कि क्या आपके कंटेनर को चालू रखने के लिए इन दो मामलों ने आपके लिए काम किया है।

शुभकामनाएं


12

आप जो चाहते हैं उसे पूरा कर सकते हैं:

docker run -t -d <image-name>

या

docker run -i -d <image-name>

या

docker run -it -d <image-name>

अन्य उत्तरों (जैसे टेल-एफ / देव / नल) द्वारा सुझाया गया कमांड पैरामीटर पूरी तरह से वैकल्पिक है, और आपके कंटेनर को पृष्ठभूमि में चलते रहने के लिए आवश्यक नहीं है।

यह भी ध्यान दें कि डॉकर प्रलेखन से पता चलता है कि संयोजन और -t विकल्प इसे खोल की तरह व्यवहार करने का कारण बनेंगे।

देख:

https://docs.docker.com/engine/reference/run/#foreground


9

मेरे पास यह कोड स्निपेट ENTRYPOINTमेरे डॉक फ़ाइल में है:

while true
do
    echo "Press [CTRL+C] to stop.."
    sleep 1
done

निर्मित डॉकटर छवि को निम्नानुसार चलाएँ:

docker run -td <image name>

कंटेनर शेल में लॉग इन करें:

docker exec -it <container id> /bin/bash

क्या यह समाधान है कि आपने इसके लिए अनंत लूप बनाया है? : डी
मुहम्मद साल्मन

8

निम्नानुसार कमांड निष्पादित करें:

docker run -t -d <image-name>

यदि आप पोर्ट निर्दिष्ट करना चाहते हैं तो नीचे दिए अनुसार कमांड करें:

docker run -t -d -p <port-no> <image-name>

निम्नलिखित आदेश का उपयोग करके चल रहे कंटेनर को सत्यापित करें:

docker ps

मुझे वास्तव में यह उत्तर सबसे अच्छा लगता है, क्योंकि सबसे लोकप्रिय उत्तर बताता है कि आपको कमांड (यानी टेल-एफ / देव / नल) की आवश्यकता है। कमांड पूरी तरह से वैकल्पिक है। यहाँ कुंजी -t का उपयोग करना है। मैंने -t के स्थान पर -i काम भी किया है, या आप दोनों को संयुक्त रूप से भी उपयोग कर सकते हैं (जैसा कि दस्तावेज से पता चलता है कि यह एक शेल के रूप में चलेगा)।
जर्सी बीन

क्या -t -dबनाम का उपयोग करने का कोई फायदा है -i -d? दोनों कंटेनर को चालू रखेंगे।
वारबैंक

5

डॉकर को अग्रभूमि में चलते रहने के लिए आपकी आज्ञा की आवश्यकता होती है। अन्यथा, यह सोचता है कि आपके एप्लिकेशन बंद हो जाते हैं और कंटेनर को बंद कर देते हैं।

इसलिए यदि आपकी डॉकटर प्रविष्टि स्क्रिप्ट निम्नलिखित की तरह एक पृष्ठभूमि प्रक्रिया है:

/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &

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

tail -f server.log

touchयदि आप लॉग फ़ाइल नहीं पा सकते हैं, तो पहले उस फ़ाइल को देखना चाहते हैं ।
शमूएल एलह

आमतौर पर लॉग फ़ाइल I टेल वर्तमान सर्वर लॉग या पुनर्निर्देशन आउटपुट है, जो प्रक्रिया शुरू होने के बाद पहले से ही होना चाहिए।
9

4

डॉकर कंटेनर बाहर निकलता है यदि कार्य अंदर किया जाता है, इसलिए यदि आप इसे जीवित रखना चाहते हैं, भले ही इसके पास कोई नौकरी न हो या पहले से ही इन्हें समाप्त कर दिया हो, तो आप कर सकते हैं docker run -di image। आपके करने के बाद आप docker container lsइसे चलाते हुए देखेंगे।


3

हो सकता है कि यह सिर्फ मैं ही हूं लेकिन CentOS 7.3.1611 और डॉकर 1.12.6 पर, लेकिन मैंने इस कार्य को मज़बूती से प्राप्त करने के लिए @VonC & @Christopher Simon द्वारा पोस्ट किए गए उत्तरों के संयोजन का उपयोग करना समाप्त कर दिया। इससे पहले कि मैंने कुछ भी नहीं किया, वह कंटेनर को सफलतापूर्वक सीएमडी चलाने के बाद बाहर निकलने से रोक देगा। मैं oracle-xe-11Gr2 और sshd शुरू कर रहा हूं।

Dockerfile

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null

फिर -d -t और -i को चलाने के लिए

docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 

अंत में दीवार के खिलाफ मेरे सिर को कोसने के घंटों के बाद

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).

सीएमडी को निष्पादित करने के बाद उपरोक्त कारण से जो भी कारण होगा, यदि पूंछ-एफ को हटा दिया जाता है, या -d -i विकल्पों में से कोई भी छोड़ दिया जाता है।



1

मेरे पास एक ही मुद्दा था, बस मेरे लिए काम करने वाले एक और टर्मिनल को खोलने के लिए:

कंटेनर बनाएँ:

docker run -d mcr.microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557

कंटेनर शुरू करें:

docker start 52bbc9b30557

कंटेनर को चालू रखने के लिए बैश शुरू करें:

docker exec -it 52bbc9b30557 bash

आप की जरूरत प्रक्रिया शुरू:

docker exec -it 52bbc9b30557 /path_to_cool_your_app

1

यदि आप अपने Dockerfile के अंत में CMD का उपयोग कर रहे हैं, तो आप जो कर सकते हैं वह अंत में कोड जोड़ रहा है। यह केवल तभी काम करेगा जब आपका डॉक्यूंट उबंटू, या किसी भी ओएस पर बनाया गया हो जो बैश का उपयोग कर सकता है।

&& /bin/bash

संक्षेप में आपके डॉकरफाइल का अंत कुछ इस तरह दिखाई देगा।

...

CMD ls && ... && /bin/bash

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


1

इंटरैक्टिव मोड के साथ रनिंग डॉक इस मुद्दे को हल कर सकता है।

यहां इंटरएक्टिव मोड के साथ और बिना रनिंग इमेज का उदाहरण दिया गया है

chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db759bb7cc7999cfff52d0a8744542fa843c95354966a18a1818

chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps

कंटेनर आईडी इमेजेज बनाई गई स्टेटस पोर्टल नाम

chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2d2d7e90e662d19d6dad8549e9c812fb2b2b7/105

chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps

कंटेनर आईडी इमेजेज तैयार किए गए STORUS PORTS NAMES c3d6a9529fd7 test_again1.0 "bash" 2 सेकंड पहले 1 सेकंड भयानक_haibt


0

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


-1

तर्क आदेश मायने रखता है

जर्सी बीन्स जवाब (सभी 3 उदाहरण) ने मेरे लिए काम किया। काफी परीक्षण और त्रुटि के बाद मुझे एहसास हुआ कि तर्कों का क्रम मायने रखता है।

कंटेनर को पृष्ठभूमि में चलता रहता है: docker run -t -d <image-name>

कंटेनर को अग्रभूमि में रखता है: docker run <image-name> -t -d

मेरे लिए पॉवरशेल पृष्ठभूमि से आना स्पष्ट नहीं था।

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