2013-06-22 18 views
34

में स्वचालित रूप से एक सेवा चलाएं मैं एक साधारण छवि स्थापित कर रहा हूं: एक जिसमें Riak (एक NoSQL डेटाबेस) है। छवि एक सीएमडी के रूप में riak start के साथ Riak सेवा शुरू होती है। अब, अगर मैं इसे docker run -d quintenk/riak-dev के साथ एक डिमन के रूप में चलाता हूं, तो यह रीक प्रक्रिया शुरू करता है (मैं लॉग में देख सकता हूं)। हालांकि, यह कुछ सेकंड के बाद स्वचालित रूप से बंद हो जाता है। अगर मैं docker run -i -t quintenk/riak-dev /bin/bash का उपयोग कर इसे चलाता हूं तो दंगा प्रक्रिया शुरू नहीं होती है (अद्यतन: इसके लिए स्पष्टीकरण के लिए उत्तर देखें)। वास्तव में, कोई भी सेवा चल रही नहीं है। मैं इसे मैन्युअल रूप से टर्मिनल का उपयोग कर शुरू कर सकता हूं, लेकिन मैं Riak स्वचालित रूप से शुरू करना चाहता हूं। मुझे लगता है कि यह व्यवहार अन्य सेवाओं के लिए भी होगा, Riak सिर्फ एक उदाहरण है।एक डॉकर कंटेनर

तो, कंटेनर को चालू/पुनरारंभ करना स्वचालित रूप से Riak शुरू करना चाहिए। इसे स्थापित करने का सही तरीका क्या है?


संदर्भ के लिए, Dockerfile जिसके साथ छवि बनाई जा सकती है (अद्यतन: चुने हुए जवाब का उपयोग कर बदल):

FROM ubuntu:12.04 
RUN apt-get update 
RUN apt-get install -y openssh-server curl 
RUN curl http://apt.basho.com/gpg/basho.apt.key | apt-key add - 
RUN bash -c "echo deb http://apt.basho.com precise main > /etc/apt/sources.list.d/basho.list" 
RUN apt-get update 
RUN apt-get -y install riak 
RUN perl -p -i -e 's/(?<=\{http,\s\[\s\{")127\.0\.0\.1/0.0.0.0/g' /etc/riak/app.config 
EXPOSE 8098 
CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1 

संपादित करें: अनुसार सीएमडी में -f करने के लिए बदल -f कुछ समय के लिए मैं डोकर साथ काम करने के बाद उनकी टिप्पणी sesm को


मेरी स्वयं का उत्तर

मेरी प्रक्रियाओं को ट्यून करने के लिए पर्यवेक्षक का उपयोग करने की आदत उठाई। यदि आप इसके लिए उदाहरण कोड चाहते हैं, तो https://github.com/Krijger/docker-cookbooks देखें। मैं अपनी सभी अन्य छवियों के लिए आधार के रूप में अपने पर्यवेक्षक छवि का उपयोग करता हूं। मैंने पर्यवेक्षक here का उपयोग करने पर ब्लॉग किया।

+0

वैसे भी। मैं अब (विकास उद्देश्यों के लिए) कंटेनर का उपयोग करके इसे शुरू कर रहा हूं, इसे जोड़ रहा हूं, और फिर Riak कमांड लाइन शुरू कर रहा हूं। – qkrijger

उत्तर

41

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

तो आप शायद उस अंतिम पंक्ति अपने Dockerfile में

CMD /bin/riak console 

या यहां तक ​​कि

CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1 

ध्यान दें कि आप सीएमडी बयान की कई पंक्तियों नहीं हो सकता है के साथ बदल सकते, केवल पिछले एक हो जाता है चलाते हैं।

+0

अब मैं दूसरा विकल्प उपयोग कर रहा हूं। आपकी प्रतिक्रिया के लिए आपका धन्यवाद! – qkrijger

4

के लिए विवरण:

अगर मैं यह docker run -i -t quintenk/riak-dev /bin/bash का उपयोग कर riak प्रक्रिया को प्रारंभ नहीं किया गया है चलाने

इस प्रकार है। डॉकरफ़ाइल में सीएमडी का उपयोग वास्तव में docker run {image} {command} का उपयोग कर कंटेनर शुरू करने के समान कार्यक्षमता है। जैसा कि गिगाब्ला ने टिप्पणी की कि केवल अंतिम सीएमडी का उपयोग किया जाता है, इसलिए डॉकरफाइल में लिखे गए एक व्यक्ति को इस मामले में अधिलेखित किया जाता है।

बिल्डफाइल में CMD /bin/riak start && tail -f /var/log/riak/erlang.log.1 का उपयोग करके, आप कंटेनर को docker run -d {image} का उपयोग करके पृष्ठभूमि प्रक्रिया के रूप में प्रारंभ कर सकते हैं, जो एक आकर्षण की तरह काम करता है।

+0

इसी प्रकार, मैं सीडीएच को डॉकराइज करने की कोशिश कर रहा हूं। उस स्थिति में, मैं RUN कमांड का उपयोग कर सेवा शुरू कर रहा हूं। यह उस रन कमांड के बाद शुरू होता है और निकलता है। क्या कारण हो सकता है? –

+0

@GopsAB शायद कुछ प्रकार की त्रुटि है जो मुख्य प्रक्रिया को (रखरखाव) से रोकती है। अपने लॉग जांचें या कंटेनर को/bin/bash के साथ मैन्युअल रूप से अपना सीएमडी आज़माएं और देखें कि – qkrijger

+0

क्या होता है यदि प्रक्रिया क्रैश हो जाती है, तो tailf चलाना जारी रहता है। @damick –

31

कंटेनर को जीवित रखने के लिए पूंछ का उपयोग करना एक हैक है। साथ ही, ध्यान दें कि लॉग रोटेशन होने पर -f विकल्प कंटेनर समाप्त हो जाएगा (इसके बजाय -F का उपयोग करके इसे टाला जा सकता है)।

supervisor का उपयोग करने का एक बेहतर समाधान है। एक डॉकर कंटेनर में Riak चलाने के बारे में इस tutorial पर एक नज़र डालें।

+3

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

3

क्योंकि मैं एक साफ रास्ता प्रक्रिया से बाहर निकलें करना चाहते हैं बाद में मैं पिछले आदेश खोल के read जो कि इस प्रक्रिया जब तक मैं बाद में इसे संलग्न और एंटर दबाएँ ब्लॉक करने के लिए कारण बनता है एक फोन करना।

[email protected]:~/docker$ sudo docker run -d -t -i -v /raid:/raid -p 4040:4040 subsonic /bin/bash -c 'service subsonic start && read -p "waiting"' 
WARNING: Docker detected local DNS server on resolv.conf. Using default external servers: [8.8.8.8 8.8.4.4] 
f27229a260c9 

[email protected]:~/docker$ sudo docker ps                                  
[sudo] password for arthur: 
ID     IMAGE    COMMAND    CREATED    STATUS    PORTS 
35f253bdf45a  subsonic:latest  /bin/bash -c service 2 days ago   Up 2 days   4040->4040 

[email protected]:~/docker$ sudo docker attach 35f253bdf45a 

[email protected]:~/docker$ sudo docker ps                                  
ID     IMAGE    COMMAND    CREATED    STATUS    PORTS 

जैसा कि आप कंटेनर को संलग्न करने के बाद बाहर निकलने और पढ़ने को अनवरोधित करने के बाद देख सकते हैं। आप निश्चित रूप से read -p की तुलना में एक अधिक परिष्कृत स्क्रिप्ट का उपयोग कर सकते हैं यदि आप अन्य करने के लिए साफ, इस तरह की सेवाओं को रोकने और बचत लॉग आदि

4

"अगर मैं का उपयोग कर इसे चलाने के डोकर रन मैं आयकर quintenk/के रूप में की जरूरत है दंगा-देव/बिन/बाश दंगा प्रक्रिया शुरू नहीं हुई है "

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

छवि/कंटेनर में, उन आदेशों को जोड़ें जिन्हें आप /etc/bash.bashrc फ़ाइल के अंत में स्वचालित रूप से प्रारंभ करना चाहते हैं।

अपने मामले में बस /bin/riak start && tail -F /var/log/riak/erlang.log.1 लाइन जोड़ें, या /bin/riak start और tail -F /var/log/riak/erlang.log.1 को वांछित कार्यक्षमता के आधार पर अलग-अलग लाइनों पर रखें।

अब अपने कंटेनर में अपने बदलाव करें, और इसे फिर से चलाएं: docker run -i -t quintenk/riak-dev /bin/bash। आप bashrc में रखे गए आदेशों को पहले ही चल रहे हैं जैसा आप संलग्न करते हैं।

+3

यह वास्तव में एक बहुत अच्छा समाधान है :) ध्यान दें कि 0.6.5 ने पर्यवेक्षकों की संगतता के लिए 'डॉकर रन-ए' विकल्प जोड़ा। आप इसे भी बाहर करना चाहते हैं। – qkrijger

+0

कोई अच्छा समाधान नहीं है। प्रक्रिया समाप्त होने पर आप क्या करेंगे, tailf चलना जारी रहेगा, कंटेनर बाहर नहीं निकलेगा। –

+0

@ MincăDanielAndrei आप सही में हैं। यह एक उत्पादन तैयार समाधान नहीं है, यह आपके द्वारा उल्लेख किए जाने वाले कारणों के लिए टिकाऊ नहीं है। यदि आपकी छवि का 'एंट्रीपॉइंट' या 'cmd' होना संभव है, तो यह सर्वोत्तम है यदि आप स्वयं को चलाने की प्रक्रिया चाहते हैं। अक्सर इसका अर्थ यह है कि कंटेनर को बाहर निकलने से रोकने के लिए कहा गया है कि एंट्रीपॉइंट पृष्ठभूमि स्वयं और बाहर निकलने के लिए, और इसे stderr/stdout पर लॉग इन करने के लिए कहा गया प्रक्रिया के लिए '--no-daemon' विकल्प' ढूंढना होगा। – damick

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