2015-07-22 17 views
7

से बाहर किए बिना पृष्ठभूमि में एक शेल स्क्रिप्ट चलाता है, मैं अपने डॉकर कंटेनर में एक शेल स्क्रिप्ट चलाने की कोशिश कर रहा हूं। समस्या यह है कि शेल स्क्रिप्ट एक और प्रक्रिया उत्पन्न करती है और इसे तब तक चलना जारी रखना चाहिए जब तक स्टार्टअप स्क्रिप्ट द्वारा उत्पन्न प्रक्रियाओं को समाप्त करने के लिए कोई अन्य शटडाउन स्क्रिप्ट का उपयोग नहीं किया जाता।डॉकर कंटेनर

जब मैं नीचे कमांड चलाएँ,

docker run image:tag /bin/sh /root/my_script.sh 

और फिर,

docker ps -a 

मुझे लगता है कि आदेश से बाहर निकल गया है। लेकिन यह वही नहीं है जो मैं चाहता हूं। मेरा सवाल यह है कि कैसे बाहर निकलने के बिना पृष्ठभूमि में कमांड चलाने के लिए?

उत्तर

3

आपने समझाया नहीं है कि आप अपनी स्क्रिप्ट के बाहर क्यों निकलने के बाद अपना कंटेनर चलाना चाहते हैं, या आपकी स्क्रिप्ट से बाहर निकलने की अपेक्षा करते हैं या नहीं।

एक डोकर कंटेनर कंटेनर की CMD रास्ते के रूप में जैसे ही बाहर निकालता है। यदि आप अपने कंटेनर को जारी रखना चाहते हैं, तो आपको एक ऐसी प्रक्रिया की आवश्यकता होगी जो चलती रहेगी। एक विकल्प अपनी स्क्रिप्ट के अंत में थोड़ी देर के पाश डाल करने के लिए बस है:

while :; do 
    sleep 300 
done 

आपकी स्क्रिप्ट से बाहर निकलें कभी नहीं होगा तो अपने कंटेनर चलते रहेंगे। यदि आपका कंटेनर नेटवर्क सेवा होस्ट करता है (एक वेब सर्वर, डेटाबेस सर्वर, आदि), तो यह आमतौर पर प्रक्रिया कंटेनर के जीवन के लिए चलती है।

यदि आपकी स्क्रिप्ट अप्रत्याशित रूप से बाहर निकल रही है, तो आपको शायद अपने कंटेनर लॉग (docker logs <container>) पर एक नज़र डालने की आवश्यकता होगी और संभवतः आपकी स्क्रिप्ट में कुछ डिबगिंग जोड़नी होगी।

यदि आप बस पूछ रहे हैं, "मैं पृष्ठभूमि में कंटेनर कैसे चला सकता हूं?", फिर एमिल का जवाब (-d ध्वज docker run पर) आपकी सहायता करेगा। साथ आदेश नीचे

docker run -i -t -d image:tag /bin/sh /root/my_script.sh 

चेक कंटेनर आईडी पृष्ठभूमि में अपने स्क्रिप्ट के साथ कंटेनर

1

लपेटें एक docker-entrypoint.sh बैश स्क्रिप्ट ब्लॉक कंटेनर प्रक्रिया और पकड़ने के लिए Ctrl-C में सक्षम है के साथ कार्यक्रम। इस बैश उदाहरण में मदद करनी चाहिए: https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash

स्क्रिप्ट को प्रक्रिया को बंद करना चाहिए जब बाहर निकलने वाला सिग्नल डॉकर द्वारा भेजा जाता है।

आप स्क्रिप्ट के अंदर एक लूप भी जोड़ सकते हैं जो बार-बार चल रही प्रक्रिया की जांच करता है।

1

भागो आप docker ps आदेश से

तो अपनी स्क्रिप्ट को सत्यापित या कंटेनर

docker exec <id> /bin/sh -l -c "ps aux" 
4

पर नहीं निष्पादित हो रहा है डॉकर रन की प्रक्रिया यूनिक्स प्रक्रिया पेड़ में init की जगह लेती है। init शीर्षतम पेरेंट प्रक्रिया है, और एक बार जब यह डॉकर कंटेनर बंद हो जाता है। कोई भी बाल प्रक्रिया (अब orphan process) भी रोका जाएगा।

$ docker pull busybox >/dev/null 
$ time docker run --rm busybox sleep 3 

real 0m3.852s 
user 0m0.179s 
sys 0m0.012s 

तो आप पैरेंट पिड से बाहर निकलने की अनुमति नहीं दे सकते हैं, लेकिन आपके पास दो विकल्प हैं। आप जगह में माता-पिता की प्रक्रिया छोड़ने के लिए और वह अपने बच्चों (उदाहरण के लिए, wait को जब तक सभी बच्चे प्रक्रियाओं बाहर आ गए हैं यह बताकर)

$ time docker run --rm busybox sh -c 'sleep 3 & wait' 

real 0m3.916s 
user 0m0.178s 
sys 0m0.013s 

प्रबंधन करने की अनुमति कर सकते हैं ... या आप बच्चे की प्रक्रिया के साथ माता-पिता की प्रक्रिया की जगह ले सकता exec का उपयोग कर। इसका मतलब यह है कि नए आदेश माता पिता प्रक्रिया के अंतरिक्ष में मार डाला जा रहा है ...

$ time docker run --rm busybox sh -c 'exec sleep 3' 

real 0m3.886s 
user 0m0.173s 
sys 0m0.010s 

यह बाद दृष्टिकोण बच्चे प्रक्रिया की प्रकृति के आधार जटिल हो सकता है, लेकिन उसे कम अनावश्यक प्रक्रियाओं चलना अधिक मुहावरे डोकर है। (जो यह नहीं कह रहा है कि आपको केवल एक प्रक्रिया होनी चाहिए।)

संबंधित मुद्दे