2015-04-01 6 views
9

मैंने डॉकरफ़ाइल से एक डॉकर छवि बनाई है, और मैं इस छवि के आधार पर एक कंटेनर चल रहा है, जब मैं समय-समय पर एक क्रोनबॉज निष्पादित करना चाहता हूं। मेरे Dockerfile इस (प्रासंगिक भागों) है:डॉकर कंटेनर के अंदर, cronjobs को निष्पादित नहीं किया जा रहा है

FROM l3iggs/archlinux:latest 

COPY source /srv/visitor 

WORKDIR /srv/visitor 

RUN pacman -Syyu --needed --noconfirm \ 
     && pacman -S --needed --noconfirm make gcc cronie python2 nodejs phantomjs \ 
     && printf "*/2 * * * *  node /srv/visitor/visitor.js \n" >> cronJobs \ 
     && crontab cronJobs \ 
     && rm cronJobs \ 
     && npm install -g node-gyp \ 
     && PYTHON=/usr/sbin/python2 && export PYTHON \ 
     && npm install 

EXPOSE 80 

CMD ["/bin/sh", "-c"] 

छवि के निर्माण के बाद मैं एक कंटेनर चलाने के लिए और सत्यापित करें कि वास्तव में cronjob जोड़ा गया है:

crontab -l 

*/2 * * * *  node /srv/visitor/visitor.js 

अब, समस्या यह है कि है cronjob कभी निष्पादित नहीं किया जाता है। मैंने निश्चित रूप से परीक्षण किया है कि "node /srv/visitor/visitor.js" कंसोल से मैन्युअल रूप से चलाते समय ठीक से निष्पादित करता है।

कोई विचार?

+3

क्रॉन को एक डिमन की आवश्यकता होती है। आधे प्रक्रिया नौकरी बना रही है, जो क्रॉन के फाइल स्टोरेज में रहती है। क्रॉन के लिए दूसरा आधा नौकरियां निष्पादित कर रहा है। आप यहां देख सकते हैं: http://stackoverflow.com/questions/20545554/how-do-i-start-cron-on-docker-ubuntu-base। यदि आप मेजबान के क्रॉन डिमन को अपने क्रोनवर्क करने के लिए चाहते हैं तो आपको कंटेनर शुरू करते समय मेजबान क्रॉन निर्देशिका को माउंट करने की आवश्यकता होगी? हालांकि यह अच्छा नहीं लगता है! – Greg

+0

ग्रेग, आप इसे उत्तर के रूप में क्यों नहीं जोड़ते? मैं वही कहने वाला था। यह भी ध्यान दें कि फ्यूजन छवि क्रॉन चलने के साथ आता है। –

+0

@ ग्रेग मैं अब समझ सकता हूं कि आप क्या कह रहे हैं। बात यह है कि, मैं या तो मेजबान की क्रॉन निर्देशिका को माउंट नहीं करना चाहता, या कंटेनर के अंदर systemd चला सकता हूं (कुछ अन्य सुझावों के अनुसार)। मुझे लगता है कि इन दोनों विधियों में अनावश्यक रूप से अन्यथा स्वच्छ प्रणाली "प्रदूषित" होगी। मेरे विकल्प क्या हैं? क्या मैं सिस्टम के बिना क्रोनी चला सकता हूं? या, क्या कोई विकल्प है? – dsljanus

उत्तर

6

यह निश्चित यह जवाब देने के लिए, जैसा कि मैंने परीक्षण करने के लिए समय नहीं है एक छोटे से मुश्किल है, लेकिन आप आप के लिए खुला विभिन्न विकल्प हैं:

  • आप Phusion आधार छवि है, जो के साथ आता है इस्तेमाल कर सकते हैं एक init प्रणाली और क्रॉन स्थापित। यह Ubuntu पर आधारित है और (कम से कम archlinux की तुलना में) अपेक्षाकृत हैवीवेट है https://registry.hub.docker.com/u/phusion/baseimage/

  • तुम सब कुछ क्रॉन नौकरियों से शुरू कर दिया है करने के लिए खुश हैं, तो आप बस अपने CMD से क्रॉन शुरू करने और अग्रभूमि में रखने के (सकता है cron -f)।

  • आप क्रोन शुरू करने के लिए हल्के प्रक्रिया प्रबंधक का उपयोग कर सकते हैं और आपको जो भी अन्य प्रक्रियाएं चाहिए (फ़्यूज़न उपयोग रनिट, डॉकर supervisor की अनुशंसा करता है)।

  • आप अपनी खुद की CMD या ENTRYPOINT स्क्रिप्ट क्रॉन और अपने प्रक्रिया शुरू होने से लिख सकते हैं। इसके साथ एकमात्र मुद्दा यह है कि आपको सिग्नल को सही तरीके से संभालने के लिए सावधान रहना होगा या आप ज़ोंबी प्रक्रियाओं के साथ समाप्त हो सकते हैं।

आपके मामले में, अगर आपके बस के आसपास खेल रहे हैं, मैं पिछले विकल्प के साथ, जाना चाहते हैं, तो यह और अधिक गंभीर कुछ भी है, मैं एक प्रक्रिया प्रबंधक के साथ जाना चाहते हैं।

+0

सबसे पहले चीज़ें, आपके पूर्ण उत्तर के लिए धन्यवाद। मैं दूसरे विकल्प के साथ जाने के इच्छुक हूं, सीएमडी कमांड के साथ क्रॉन चला रहा हूं, क्योंकि मैं बस इतना करना चाहता हूं कि हर 2 मिनट में इन्फिनिटम में एक ही कमांड चलाया जाए। बात यह है कि आर्क में कोई "क्रॉन" नहीं है क्योंकि क्रॉनी एक बाद का पैकेज है। इसके अलावा, अगर यह अतिव्यापी है, तो क्या मैं पृष्ठभूमि में क्रॉन चला सकता हूं? तो मैं कंटेनर से संलग्न कर सकता हूं जो मुझे कभी चाहिए। – dsljanus

+0

मुझे क्रॉनी के बारे में कुछ भी पता नहीं है, लेकिन मुझे उम्मीद है कि यह वही काम करेगा। आप अभी भी 'डॉकर निष्पादन-कंटेनर/बिन/बाश' के साथ कंटेनर में जा सकते हैं, इसलिए यह कोई समस्या नहीं है। –

+0

चल रहे कंटेनर के अंदर, क्रॉन्ड चल रहा है, और "ps -aux | grep cron" द्वारा सत्यापित किया गया है। बेशक यह मैन्युअल रूप से कहा गया था। बात यह है कि अभी भी कोई cronjobs निष्पादित किया जा रहा है। – dsljanus

7

एक विकल्प निम्नलिखित तरीके से मेजबान के crontab उपयोग करने के लिए है:

0 5 * * * docker exec mysql mysqldump --databases myDatabase -u myUsername -pmyPassword > /backups/myDatabase.sql 

ऊपर समय-समय पर एक MySQL डेटाबेस के एक दैनिक बैकअप ले जाएगा।

आप श्रृंखला जटिल आदेशों की जरूरत है, तो आप भी इस प्रारूप का उपयोग कर सकते हैं:

0 5 * * * docker exec mysql sh -c 'mkdir -p /backups/`date +\%d` && for DB in myDB1 myDB2 myDB3; do mysqldump --databases $DB -u myUser -pmyPassword > /backups/`date +\%d`/$DB.sql; done' 

ऊपर विभिन्न डेटाबेस की एक 30 दिन रोलिंग बैकअप लेता है और एक पार्टी लेखन के बजाय एक पंक्ति में पाश के लिए करता है और ऐसा करने के लिए एक शेल स्क्रिप्ट को बुलाओ। तो यह बहुत लचीला है।

या आप भी डोकर कंटेनर के अंदर जटिल स्क्रिप्ट डाल दिया और उन्हें इतनी तरह चला सकते हैं:

0 5 * * * docker exec mysql /dailyCron.sh 
+0

यह दृष्टिकोण आपको कार्य कॉन्फ़िगर किए गए एप्लिकेशन पक्ष को रखने में मदद नहीं कर सकता है। – BigDong

3

आप --net = होस्ट के साथ अपने डोकर कंटेनर चला रहे हैं, इस सूत्र देखें: https://github.com/docker/docker/issues/5899

मेरे पास एक ही समस्या थी, और जब मैंने डॉकर रन कमांड लाइन तर्कों में --pid = होस्ट शामिल किया था तो मेरे क्रॉन कार्य चलने लगे।

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